高精度計算需要注意的幾個問題:
1.用字串的讀入方式,再按字元分別轉成數字2.不能用數值型的讀入方式
二、計算過程中考慮進製和借位問題(先不急於處理,在計算結束時處理)1.陣列第i元素》=10(或<0)需要考慮2.從上位增或減1,本位減或加10三、輸出時注意跳過高位多餘的0四、陣列需要稍微大一些,避免運算時溢位問題描述
求兩個不超過200位的非負整數的積。
輸入資料有兩行,每行是乙個不超過200位的非負整數,沒有多餘的前導0。
輸出要求
一行,即相乘後的結果。結果裡不能有多餘的前導0,即如果結果是342,那麼就不能輸出為0342。
輸入樣例
12345678900
98765432100
輸出樣例
1219326311126352690000
解題思路
1.用unsigned an1[200]和unsigned an2[200]分別存放兩個乘數,用aresult[400]來存放積。計算的中間結果也都存在aresult中。aresult長度取400是因為兩個200位的數相乘,積最多會有400位。an1[0], an2[0], aresult[0]都表示個位。
2.乙個數的第i位和另乙個數的第j位相乘所得的數,一定是要累加到結果的第i+j位上。這裡i, j都是從右往左, 從0開始數。
3.計算的過程基本上和小學生列豎式做乘法相同。為程式設計 方便,並不急於處理進製,而將進製問題留待最後統一處理。
#include #include using namespace std;
#define max 200
int multiply(int *a1, int *a2, int *result, int nlen1, int nlen2)
}for(int k = 0; k <= nlen1 + nlen2; ++k)
if(result[k])
}return nhighestpos;
}int main()
int nlen2 = strlen(s2);
for(int i = nlen2 - 1, j = 0; 0 <= i; --i)
int flag = multiply(a1, a2, result, nlen1, nlen2);
//進製處理
bool bstartoutput = false;//此變數用於跳過多餘的0
for(int k = flag; 0 <= k; --k)
else if(result[k])
}if(!bstartoutput)
cout << endl;
delete s1;
delete s2;
delete a1;
delete a2;
delete result;
}return 0;
}
大整數乘法
參考 http hi.baidu.com operationsystem blog item 6e45dd1af1acadf3ae51330b.html 在計算機中,長整型 long int 變數的範圍是 2147483648 至 2147483647,因此若用長整型變數做乘法運算,乘積最多不能超過...
大整數乘法
問題描述 by 計算機演算法設計與分析 王曉東 p17 通常,在分析乙個演算法的計算複雜性時,都將加法和乘法運算當作是基本運算來處理,即將執行一次加法或乘法運算所需的計算時間當作乙個僅取決於計算機硬體處理速度的常數。這個假定僅在計算機硬體能對參加運算的整數直接表示和處理時才是合理的。然而,在某些情況...
大整數乘法。
include using namespace std int multi int num1,int size1,int num2,int size2 int size size1 size2 int ret new int size int i 0 for i 0 iret i 0 for i 0...