`
- 浏览:
25459 次
-
还不能处理负数和小数点
package s1;
import java.util.Stack;
import java.util.Vector;
/** *//**
* A multiply simulation
* for example :
* 56 X 67 =
*
* 56
* x 67
* ----------
* 392
* 336
*------------
* 3752
*
* So ,in this way,We can calculation very very big number,for example: 299^133 etc.
*
* @author Urashima
*
*/
public class BigNumberMultiply extends BaseNumberOperation{
//each array indicates a param
private Integer[] paramFirst,paramSecond;
//main method
public String calculate(String param1,String param2){
paramFirst = convert(param1);
paramSecond = convert(param2);
//multiply each bit,from low to high
int indexFirst = paramFirst.length - 1;
int indexSecond = paramSecond.length - 1;
//multiply results for each bit
Vector<Integer[]> branchResults = new Vector<Integer[]>();
for(;indexSecond > -1;indexSecond--){
branchResults.add(branchMultiply(paramFirst,paramSecond[indexSecond]));
}
String finalResult = branchAddTogether(branchResults);
return finalResult;
}
private Integer[] branchMultiply(Integer[] upper,Integer down){
Stack<Integer> results = new Stack<Integer>();
//todo : all core gose here
int carryFlag = 0;
for(int index = upper.length-1 ;index > -1;index--){
int r1 = down;
int r2 = upper[index];
int r0 = r1 * r2 + carryFlag;
carryFlag = (int)(r0/10);
int r3 = r0 - ( 10 * carryFlag );
if(index!=0)
results.push(r3);
else
results.push(r0);
}
//sorts out and return
Integer[] branchResult = new Integer[results.size()];
results.toArray(branchResult);
//System.out.println (branchResult.toString());
return branchResult;
}
private String branchAddTogether(Vector<Integer[]> v){
Vector<String> params = new Vector<String>();
//TODO: fix bug#001
int bi = 0;
for(Integer[] pps : v){
//revers pps
Integer[] rpps = new Integer[pps.length];
System.arraycopy(pps,0,rpps,0,pps.length);
for(int k = pps.length-1 ; k > -1 ; k-- ){
rpps[pps.length-1-k] = pps[k];
}
v.set(bi++,rpps);
}
//sort out data,add increamental 0 to each bit
for(Integer[] ii : v){
String pa = "";
for(Integer i : ii){
pa += i;
}
params.add(pa);
}
int incr = 0;
for(int idx = 0 ; idx < params.size(); idx ++){
String s = params.get(idx);
for(int i = 0 ; i < incr ; i ++){
s += "0";
}
params.set(idx,s);
//System.out.println (s);
incr++;
}
//convert back to int[]
for(int i = 0 ; i < params.size();i++){
String ctt = params.get(i);
//System.out.println (ctt);
v.set(i,convert(ctt));
}
//add them together
Stack<Integer> result;
//trim right and add
result = trimRightAdd(v);
StringBuffer sb = new StringBuffer();
try{
while(true)
sb.append(result.pop());
}catch(Exception e){
//pass,ignore.
}
return sb.toString();
}
private Stack<Integer> trimRightAdd(Vector<Integer[]> params){
Stack<Integer> result = new Stack<Integer>();
int carry = 0;
int maxBit = 0;
//todo:maxbit
for(Integer[] i : params){
int il = i.length;
maxBit = il > maxBit?il:maxBit;
}
//bit moving , from low to higth
int indexDecreaseCount = 1;
int columnValue = 0;
int bitValue = 0;
for(int k = 0 ; k < maxBit; k++){
if(k > 0){
result.push(bitValue);
columnValue = 0;
bitValue = 0;
}
//value of each column,including carry
int num = 0;
for(Integer[] param : params){
int index = param.length - indexDecreaseCount;
try{
num = param[index];
}catch(Exception e){
num = 0;
}
//TODO: may be simulation calculate is better here
columnValue += num;
}
//first bit
if(k != maxBit-1 ){
columnValue += carry;
carry = (int)(columnValue/10);
bitValue = columnValue - ( 10 * carry );
indexDecreaseCount ++;
}else{
columnValue += carry;
result.push(columnValue);
}
}
return result;
}
} 测试计算结果
package s1;
public class Demo{
private TwoNumberOperation operatorMultiply = new BigNumberMultiply();
分享到:
Global site tag (gtag.js) - Google Analytics
相关推荐
机器学习算法实践:knn算法实现分类,计算识别准确率(鸢尾花数据集) 机器学习算法实践:knn算法实现分类,计算识别准确率(鸢尾花数据集) 机器学习算法实践:knn算法实现分类,计算识别准确率(鸢尾花数据集) ...
(android demo)算法实现:计算十进制数N的二进制形式中包含数字1的个数
蚁群算法工具箱蚁群算法资料:蚁群算法工具箱蚁群算法资料:蚁群算法工具箱蚁群算法资料:蚁群算法工具箱蚁群算法资料:蚁群算法工具蚁群算法工具箱蚁群算法资料:箱蚁群算法资料:蚁群算法工具蚁群算法工具箱蚁群...
实现多项式的加法与乘法 数据结构与算法 为什么要超过二十字
第6章到第9章分别给出了几个领域的算法,如序列和集合的算法(排序、序列比较、匹配等)、几何算法(凸包和交集问题等)、代数和数值算法(矩阵乘法、快速傅里叶变换等);第10章涉及归约或约简,也是第11章的序幕,...
整理最全资料:并行计算大作业:矩阵乘法,排序算法,代码+课件+报告超详细
JS 字符串乘法
计算模型与算法技术:3-Brute Force.ppt
算法实现代码:给定表示书的页码n,计算书的全部页码中分别用到多少次数字0,1,2,3,4,5,6,7,8,9
java关于加密的算法demo代码(Base64加密\数字签名\对称加密算法\非对称加密算法\消息摘要算法) JAVA安全实现三种方式: 1.JDK 2.Commons Codec 3.Bouncy Castle 一。非对称加密算法: 1.DH 2.RSA 3.ELGamal 二。...
算法系列之二十:计算中国农历
并行计算大作业:矩阵乘法报告
对算法分析与设计课程中大整数乘法的实现,并实现不同位数的大整数相乘
java 国密算法实现,包含SM2 SM3 SM4和数字签名、数字证书的验证以及相应的说明文档
欧几米的算法乘法逆元算法.欧几米的算法乘法逆元算法
用C语言,C#,java分别实现的九九乘法表算法
适合学习算法和程序员。算法精解:C语言描述(中文版).pdf
SM2数字证书,充分借鉴与吸收了X509数字证书的格式与优点,在考虑RSA算法的优缺点之后,推出的基于商密公钥算法的SM2证书规范,至此,商密算法的数字证书在商用密码应用安全性评估中成为了必须要检测的一个重要环节...
算法:C语言实现(第1~4部分)答案。