大数相乘

这道题考了几遍了,一直写的不完美。刚好有空思考了下,其实思路还是挺清晰的。

总共设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;
        }
    }
}

  

posted @ 2017-08-02 08:51  贾斯彼迭  阅读(119)  评论(0编辑  收藏  举报