标签:package java oid 大数 思考 pac min 求和 static
这道题考了几遍了,一直写的不完美。刚好有空思考了下,其实思路还是挺清晰的。
总共设2个辅助数组,一个记录第k位 的累加和val[ ], 一个记录第k位产生的进位。carry[ ]
然后就是循环去做吧,不过要先把数组逆序去求和,因为数组存储顺序和我们习惯的竖式计算方法顺序相反。
先贴代码。(一些特殊情况暂未考虑)
package PDD._1;
/**
* Created by Administrator on 2017/8/2 0002.
*/
public class _BigNumberMulti {
public static void main(String[] args){
String str1 = "19287509125012";
String str2 = "40241046016719";
char[] chas1 = str1.toCharArray();
char[] chas2 = str2.toCharArray();
System.out.println(getResult(chas1, chas2));//771500365000480482092033438
}
public static String getResult(char[] chas1, char[] chas2){
if(chas1 == null || chas1.length == 0 || chas2 == null || chas2.length == 0){
return "";
}
reverse(chas1);
reverse(chas2);
int[] val = new int[chas1.length + chas2.length];
int[] carry = new int[chas1.length + chas2.length];
for(int i = 0; i < chas1.length; i++){ // 先遍历一遍求累加和
for(int j = 0; j < chas2.length; j++){
val[i + j] += (chas1[i] - ‘0‘) * (chas2[j] - ‘0‘);
}
}
for(int k = 0; k < chas1.length + chas2.length - 1; k++){ //再遍历一遍求单位累加和与进位
int tmp = val[k] + (k > 0 ? carry[k-1] : 0);
val[k] = tmp % 10;
carry[k] = tmp / 10;
}
StringBuilder sb = new StringBuilder(); //输出吧!
if(carry[chas1.length + chas2.length -2] != 0){
sb.append(carry[chas1.length + chas2.length -2]);
}
for(int i = chas1.length + chas2.length - 2; i >= 0; i--){
sb.append(val[i]);
}
return sb.toString();
}
public static void reverse(char[] chas){
int len = chas.length;
for(int i = 0, j = len - 1; i < j; i++, j--){
char tmp = chas[i];
chas[i] = chas[j];
chas[j] = tmp;
}
}
}
标签:package java oid 大数 思考 pac min 求和 static
原文地址:http://www.cnblogs.com/CodeCafe/p/7271954.html