大數是演算法語言中的資料型別無法表示的數,其位數超過最大資料型別所能表示的範圍,所以,在處理大數問題時首先要考慮的是怎樣儲存大數,然後是在這種儲存方式下其處理的實現方法。
一般情況下大數的儲存是採用字元陣列來儲存,即將大數當作乙個字串來儲存,而對其處理是按其處理規則在陣列中模擬實現。
大數乘法,相對之前的加法和減法,難度有所提高,但是本質還是一樣的。
下面說說我的方法:
1、利用字元陣列讀入大數a,b
2、將大數反向儲存到整型陣列中。(此時滿足低位在陣列下標小的位置上)
3、逐個相乘。 此時要注意 乘數i位和乘數j位的乘積,應累加在結果陣列的i+j位上。 這個結論不難發現,可通過列個簡單的豎式乘法驗證。
4.、處理進製,(從低位開始到最高位逐位處理,將本位結果的個位作為該為的結果,而10位以上的數均作為進製進到上一位,一直到所有進製處理完)
5、然後整體再反向存入字元陣列,列印出結果。
思路很常規,演算法也比較簡單,但是效率方面,可能不太理想。
水平有限,只能寫出這樣的**。以後有能力了,再優化優化。
[cpp]view plain
copy
#include
#include
#define maxlen 1000
intmain()
for(i=0; i<2*maxlen; i++)
num_c[i] = 0;
len_a = strlen(str_a); //顛倒儲存a,b兩大數
i = len_a - 1;
k = 0;
while
( i>=0 )
num_a[k++] = str_a[i--] - '0'
; len_b = strlen(str_b);
i = len_b - 1;
k = 0;
while
( i>=0 )
num_b[k++] = str_b[i--] - '0'
; for
( i=0; i//先不考慮進製,對應加到結果陣列num_c中
for( j=0; j
num_c[i+j] += num_a[i] * num_b[j];
k = 2 * maxlen - 1;
while
( k>=0 && num_c[k]==0 )
//尋找最高位
k--;
i = 0;
d = 0;
while
( i<=k )
//處理進製
while
( d>0 )
//處理最高位進製
k = i; //得到結果的最高位
for( i=k-1; i>=0; i-- )
str_c[k-i-1] = num_c[i] + '0'
;
//結果轉換成字元
str_c[k] = '\0'
; printf("%s\n"
,str_c);
//結果轉換成字串
} return
0;
}
4 大數,高精度計算 大數加法
大數是演算法語言中的資料型別無法表示的數,其位數超過最大資料型別所能表示的範圍,所以,在處理大數問題時首先要考慮的是怎樣儲存大數,然後是在這種儲存方式下其處理的實現方法。一般情況下大數的儲存是採用字元陣列來儲存,即將大數當作乙個字串來儲存,而對其處理是按其處理規則在陣列中模擬實現。思路很常規。先用字...
9 大數,高精度計算 大數階乘
大數是演算法語言中的資料型別無法表示的數,其位數超過最大資料型別所能表示的範圍,所以,在處理大數問題時首先要考慮的是怎樣儲存大數,然後是在這種儲存方式下其處理的實現方法。一般情況下大數的儲存是採用字元陣列來儲存,即將大數當作乙個字串來儲存,而對其處理是按其處理規則在陣列中模擬實現。階乘問題比較典型,...
大數,高精度計算 百位大數
大數是演算法語言中的資料型別無法表示的數,其位數超過最大資料型別所能表示的範圍,所以,在處理大數問題時首先要考慮的是怎樣儲存大數,然後是在這種儲存方式下其處理的實現方法。一般情況下大數的儲存是採用字元陣列來儲存,即將大數當作乙個字串來儲存,而對其處理是按其處理規則在陣列中模擬實現。百位大數.讓人又愛...