6 大數,高精度計算 大數乘法

2021-06-22 13:04:01 字數 1687 閱讀 4165

大數是演算法語言中的資料型別無法表示的數,其位數超過最大資料型別所能表示的範圍,所以,在處理大數問題時首先要考慮的是怎樣儲存大數,然後是在這種儲存方式下其處理的實現方法。

一般情況下大數的儲存是採用字元陣列來儲存,即將大數當作乙個字串來儲存,而對其處理是按其處理規則在陣列中模擬實現。

大數乘法,相對之前的加法和減法,難度有所提高,但是本質還是一樣的。

下面說說我的方法:

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 大數,高精度計算 大數階乘

大數是演算法語言中的資料型別無法表示的數,其位數超過最大資料型別所能表示的範圍,所以,在處理大數問題時首先要考慮的是怎樣儲存大數,然後是在這種儲存方式下其處理的實現方法。一般情況下大數的儲存是採用字元陣列來儲存,即將大數當作乙個字串來儲存,而對其處理是按其處理規則在陣列中模擬實現。階乘問題比較典型,...

大數,高精度計算 百位大數

大數是演算法語言中的資料型別無法表示的數,其位數超過最大資料型別所能表示的範圍,所以,在處理大數問題時首先要考慮的是怎樣儲存大數,然後是在這種儲存方式下其處理的實現方法。一般情況下大數的儲存是採用字元陣列來儲存,即將大數當作乙個字串來儲存,而對其處理是按其處理規則在陣列中模擬實現。百位大數.讓人又愛...