此文參考自:
大數相加
1、從結尾開始每位相加
2、兩個整數長度不相等(肯定有乙個已經加完了,再把沒有加完的加上去)
3、最高位有進製,要再進一位
4、結果字串逆序
大數相乘
分析
12*34=?
乘數:12
被乘數:34
1、先把乘數列出來,第i行列左起第i位數,列n次(n為乘數的位數)
第二行起每次右移一位
(1)
(1)(2)
(2)
2、寫入被乘數,按先列後行的方式
(1,3)
(1,4)
(2,3)
(2,4)
3、將()內的數兩乘
(1,3=3)
(1,4=4)
(2,3=6)
(2,4=8)
4、相加,注意進製
(1,3=3) (1,4=4)
(2,3=6) (2,4=8)
-------------------------
3 10 8
.
-------------------------
4 0 8
12*34=408
再看三位數乘法
123*456=?
第一步:
(1)
(1)(1)
(2)(2)
(2)(3)
(3)(3)
第二步:
(1,4)
(1,5)
(1,6)
(2,4)
(2,5)
(2,6)
(3,4)
(3,5)
(3,6)
第三步:
(1,4=4)
(1,5=5)
(1,6=6)
(2,4=8)
(2,5=10)
(2,6=12)
(3,4=12)
(3,5=15)
(3,6=18)
第四步:
(1,4= 4) (1,5= 5) (1,6= 6)
(2,4= 8) (2,5=10) (2,6=12)
(3,4=12) (3,5=15) (3,6=18)
----------------------------------------------
4 13 28 27 18
. . . .
----------------------------------------------
5 6 0 8 8
123*456=56088
分析一下每一位的值是如何計算出來的,以下說的位都是從個位算起:
結果的第i位,是乘數的第i位乘以被乘數的1位,再加上乘數的第i-1位乘以被乘數的第2位,一起加到乘數的第1位乘以被乘數的第i位。
這樣描述起來有點不明白,畫個圖就很清楚了:
123*456的第3位:從乘數的第3位(1)起到第1位(3),按從右向左的方式
逐個乘以被乘數:
1*6+2*5+3*4=28
再把進製加上就可以了。
即:計算結果的第i位(權值肯定為i,第1位也就是個位權值為0(pow(10, 0)))。等於乘數的第(i~0)位分別與被乘數的第(0~i)位相乘,因為這樣每位相乘之後權值仍為i 。然後相加再加上前一位的進製,就是結果的第i位
到這裡,已經可以得出乙個通用的計算方法,把結果逐位計算出來。
通過上面的分析,我們知道了演算法的核心思想,接下來就能把演算法實現
#include
#include
#include
#include
#include
using
namespace
std;
//c++大數相加
string bignumadd(const
string& strnum1, const
string& strnum2)
//兩個整數長度不相等(肯定有乙個已經加完了,不需要再額外加if來判斷,因為while就可以判斷)
while (len1 >= 0)
while (len2 >= 0)
//最高位有進製
if (bit != 0)
strsum += bit + '0';
//反轉
reverse(strsum.begin(), strsum.end());
return strsum;
}//c++大數相乘
string bignummultiply(const
string& strnum1, const
string& strnum2)
//加上進製
tmp += bit;
//為了防止最後一位是0,但是卻加上了
if (tmp == 0 && i == len1+len2+1)
break;
//求餘得到結果的第i位
strmultiply += tmp % 10 + '0';
//計算新的進製
bit = tmp / 10;
}//判斷結果的最後乙個字元如果是0的話說明可以刪去
//if (strmultiply[strmultiply.size()-1] == '0')
// strmultiply[strmultiply.size()-1] = '\0';
//反轉
reverse(strmultiply.begin(), strmultiply.end());
return strmultiply;
}int main()
cout
<< rlt << endl;
return
0;}
輸入:
123111111111
45622222222
5
輸出:
168733333333
5616602469103375308642
120
C 大數問題
語法 add char a,char b,char s 引數 a 被加數,用字串表示,位數不限 b 加數,用字串表示,位數不限 s 結果,用字串表示 返回值 null 注意 空間複雜度為 o n 2 需要 string.h 源程式 void add char a,char b,char back e...
C 大數問題
語法 add char a,char b,char s 引數 a 被加數,用字串表示,位數不限 b 加數,用字串表示,位數不限 s 結果,用字串表示 返回值 null 注意 空間複雜度為 o n 2 需要 string.h 源程式 void add char a,char b,char back e...
大數相加問題c 做法
大數相加問題c 做法 描述對您來說,我有乙個非常簡單的問題。給定兩個整數a和b,計算a b的總和。輸入由兩個正整數a和b組成。請注意,這些整數非常大,這意味著您不應使用32位整數對其進行處理。您可以假設每個整數的長度不超過1000。輸出輸出sum,sum表示a b的結果。輸入樣例 1 1 21122...