c=a * b (a、b均是高精度數)
比如a=156,b=3,求a * b
很容易知道答案是468,怎樣算的呢?
① 首先讓3 * 6 = 18,然後向進一位,並且這位只保留8
② 讓3 * 5 + 進製1 = 16,然後向前進一位,並且這位只保留6
③ 讓3 * 1 + 進製1 = 4,此時不向前進製,保留4
所以最終答案是468
通過這個例子我們再來分析發現,c0 = a0 * b0,c1 = a1 * b0,c2 = a2 * b0,可以看出c的下標是和a、b下標相關的,0=0+0,1=1+0,2=2+0。
由此我們可以得出c[i+j] += a[i] * b[j]。
那麼核心**就出來了
c[i+j]
+=a[i]
*b[j]
; c[i+j+1]
+=c[i+j]/10
;// 進製
c[i+j]%=
10;//實際保留的值
完整**:
#include
#include
using
namespace std;
int a[
10000
],b[
10000
],c[
10000];
intmain()
int lenc=lena+lenb-1;
// 兩位數相乘最大位數是lena+lenb ,-1是因為下標從0開始
while
(c[lenc]==0
&& lenc>
0) lenc--
;// 去前導0
for(
int i=lenc; i>=
0; i--
)}
至於為什麼是c[i+j]+=a[i]*b[j],而不是c[i+j]=a[i]*b[j],因為剛才上面的例子 b 是個一位數的,而實際中 b 是有很多位數字組成的,你要把那些都累加起來才能構成乙個ci的。
舉個例子:
借鑑:高精度運算(大數運算)
高精度乘高精度
思路 用vector表示大整數,整數的低位存在陣列索引的低位 a x b c其中c的每一位 如第3位 是由a和b的相應位相乘累加,處理後得到 如 1 2,2 1 include using namespace std const int demical 10 void input string s,...
大數相乘「高精度乘低精度」和「高精度乘高精度」
二 高精度乘高精度 如下 由於計算機的儲存位元組有限,所以不能完整表示乙個很大整數的精確值,這時候就得用到其他的方法,稱之為高精度演算法。這裡的高精度乘法主要指按位模擬乘法,實際上就是模擬乘法的過程,也就是筆算的過程。高精度乘低精度,即乙個大數與乙個小於10000的數相乘,大數使用字串來進行儲存,較...
演算法 高精度乘法2(高精度乘高精度)
題目描述 高精度乘,求兩個很大的非負整數相乘的結果。輸入 2個非負整數,每個一行,每個整數不超過240位。輸出 乙個整數,表示相乘的結果。例子 為了和演算法對應方便,用上面數乘下面數的方法12 5 2512 5502 5312 5為了運算方便,將上面兩數倒置,得到的結果也為倒序下標0 1234 56...