大数相乘
Posted 贾斯彼迭
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了大数相乘相关的知识,希望对你有一定的参考价值。
这道题考了几遍了,一直写的不完美。刚好有空思考了下,其实思路还是挺清晰的。
总共设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; } } }
以上是关于大数相乘的主要内容,如果未能解决你的问题,请参考以下文章