(陣列)大數相乘,相加

Kobe10發表於2017-02-06
  • 題目一:大數相乘。
  • 題目分析:兩個大數相加,考慮到資料型別不能表示大數,所以用字串直接處理兩個數。兩個數字,用一個數逐位的與另一個數相乘,將所得的乘積逐位相加(注意進位的情況)。最後得到的就是所要的數字。因為m位的數乘以n位的數,最多得到m+n的位數,所以用m+n的陣列儲存最終結果。
    這個是程式碼的計算過程圖。
  • 程式碼:
    public String multiply(String num1, String num2) {
        int n1 = num1.length();
        int n2 = num2.length();
        StringBuilder sb = new StringBuilder();
        int[] tmp = new int[n1+n2];
         
        for(int i=n1-1;i>=0;i--){
            for(int j=n2-1;j>=0;j--){
                tmp[i+j+1] +=(num1.charAt(i)-'0')*(num2.charAt(j)-'0');
            }
        }
        int carrybit=0;//從個位開始,carrybit是進位
        for(int i=tmp.length-1;i>=0;i--){
            tmp[i]+=carrybit;
            carrybit=tmp[i]/10;
            tmp[i]=tmp[i]%10;
             
        }
        int left=0;
        while(left<tmp.length-1&&tmp[left]==0)
            left++;
        for(;left<tmp.length;left++){
            sb.append(tmp[left]);
        }
        return sb.toString();   
    }

     

  • 題目二:大數相加
  • 題目分析:利用字串進行相加減。
  • 程式碼:
    class Solution {
    public:
        string addBinary(string a, string b) {
            int len_a = a.size()-1;
            int len_b = b.size()-1;
            int carry = 0;
            string sum;
            while (len_a >= 0 || len_b >= 0){
                int flag = 0;
                if (len_a >= 0){
                    flag += a[len_a] - '0';
                    len_a--;
                }
                else
                    flag += 0;
                if (len_b >= 0){
                    flag += b[len_b] - '0';
                    len_b--;
                }
                else
                    flag += 0;
                flag += carry;
                carry = flag/2;
                sum = static_cast<char>(flag%2+'0') + sum;
            }
            if (carry == 1)
                sum = '1' + sum;
            return sum;
        }
    };

     

相關文章