大數相加,大數相乘

大數相加

大數相加的核心思想就是對應位置的數相加後,再加上一次計算結果的進位,得到結果後,結果%10得到當前位置的數,結果/10得到進位,週而復始。

    public static String add(String s1,String s2) {
        StringBuffer res = new StringBuffer();
        s1 = new StringBuffer(s1).reverse().toString();
        s2 = new StringBuffer(s2).reverse().toString();
        int len1 = s1.length();
        int len2 = s2.length();
        int max = len1>len2?len1:len2;
//        用0補齊到相同長度,方便計算
        if(len1 < len2) {
            for (int i = len1; i < len2; i++) {
                s1+="0";
            }
        }else {
            for (int i = len2; i < len1; i++) {
                s2+="0";
            }
        }
        int c = 0;//進位
        for (int i = 0; i < max; i++) {
//            減0是可以直接拿到數字大小
            int temp = (s1.charAt(i) - '0') + (s2.charAt(i) - '0') + c;
            int cur = temp%10;//這是進位後的個位數
            res.append(cur);//將這個數添加到結果中
            c = temp/10;//進位
        }
        if(c>0) {//判斷最後是否有進位大於0,如果有添加
            res.append(c);
        }
        return res.reverse().toString();//反轉輸出
    }

大數相乘

思路講解可以看這一篇文章大數乘法[JAVA實現]-經典筆試題,核心還是多項式相乘的十字相乘法,下面是經過修改的具體實現

    public String multify(String s1, String s2) {
        int len1 = s1.length();
        int len2 = s2.length();
        int[] res = new int[len1 + len2];//存放的結果集
        for (int i = 0; i < len1; i++) {
            int n1 = s1.charAt(i) - '0';//減0直接得到0-9的數字大小
            for (int j = 0; j < len2; j++) {
                int n2 = s2.charAt(j) - '0';
                res[i + j] += n1 * n2;//這是基於交叉相乘的思路,上面文章中有介紹
            }
        }
//        得到結果集,例如53*34,目前res=[15,29,12]
        for (int i = res.length - 1; i > 0; i--) {
            res[i - 1] += res[i] / 10;//將低位結果/10後就是進位,將進位加到i-1的位置
            res[i] = res[i] % 10;//結果%10得到進位後當前位置的數
        }
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < res.length-1; i++) {
            sb.append(res[i]);//遍歷進行結果拼接
        }
        return sb.toString();
    }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章