大整數乘法之模擬筆算法

emm算法設計書上講了個基於遞歸分治法的一個方法,大概思路就是把好比兩位數的乘法須要4次乘法運算變成只須要2次。emm我感受通常還沒大到要分治法來什麼吧,就直接寫了個模擬筆算的方法。算法

看代碼:app

package www.com.leetcode.specificProblem;


//模擬筆算法
public class BigIntMultiply {

    public String bigIntMultiply(String a, String b) {
        StringBuilder sba = new StringBuilder(a);
        StringBuilder sbb = new StringBuilder(b);
        StringBuilder result = new StringBuilder("");
        
        int[] num = new int[sba.length() + sbb.length()];
        
        for(int i = sbb.length() - 1; i >= 0; i --) {
            int numB = sbb.charAt(i) - '0';
            for(int j = sba.length() - 1; j >=0; j --) {
                int multiplyTemp = numB * ( sba.charAt(j) - '0' );//這個位乘法的結果
                int resultTemp = (multiplyTemp % 10) + num[i + j + 1];
                num[ i + j + 1] = resultTemp % 10;//這個i + j + 1是本身寫了個豎式找規律找出來的
                num[i + j] += (multiplyTemp / 10) + (resultTemp / 10);//第一個是這兩個位相乘的進位,第二個是乘積的個位加上原本這個位上的數字後的進位
            }
        }   
        boolean begin = false;
        for(int intTemp : num) {
            if(intTemp != 0)begin = true;//第一次看到非0的數字就開始添加到字符串了
            if(begin)result.append(intTemp);
        }
        return result.toString();
    }
    
    public static void main(String[] args) {
        System.out.println(new BigIntMultiply().bigIntMultiply("1237", "998"));
    }

}
相關文章
相關標籤/搜索