ADV 206 不大的數 高精度乘法

2021-08-10 11:47:00 字數 2035 閱讀 2868

問題描述

在當今的大資料時代,超大數的高精度計算已經成為眾多領域的熱門研究之一。現在t校也想在此領域有所造詣已造福於全社會,然而由於時間有限,所以短時間內難以找出大數計算的通用演算法,於是學校找到了同學中的「神霸」——你來幫忙,並僅要求你能在數並不算大的時候給出結果。又出於某種特殊需要,也並不要求你給出數的全部結果,而只是要求結果的前10位(注意不是後10位),並考慮到2的冪次的特殊性和典型性,所以要你計算的數均為2的冪次。

輸入格式

乙個自然數n。

輸出格式

2的n次冪的前10位。

樣例1 輸入

60樣例1 輸出

1152921504

樣例2 輸入

60000

樣例2 輸出

6305794870

資料規模和約定

0<=n<=10000000

注釋=。=

ps:一、2^i,當i>34時,會超過10位數字,2^40有13位數字

二、b=2^i,當i>34且i%10==0時,b=b/1000,

即2^10==1024;1024/1000=1.024;

1.024^97.1==10.0028968...

b*2^10/1000==b*1.024

(b*1.024)^97.1/10.0028968...=b=^97.1

三、每乘971個2,要/10

例:

# include # include // 呼叫strlen函式的標頭檔案

int main(void) ; // 再定義三個陣列,前兩個用於接收字元陣列裡的數字各個位的數值,最後乙個用於儲存最終結果的各個位的數值

int len1, len2, len; // 前兩個分別表示字元陣列a1,b1的實際長度,最後乙個表示兩個字元陣列實際長度之和

scanf("%s%s", a1, b1); // 對兩個字元陣列進行賦值

len1 = strlen(a1); // 將字串a1的長度賦給len1,用於陣列的賦值

len2 = strlen(b1); // 將字串b1的長度賦給len2, 用於陣列的賦值

len = len1 + len2; // 將兩字串實際長度之和賦給len

for (int i = 0; i < len1; i++) // 用for迴圈,實現字元陣列a1內數字向陣列轉移

a[i] = a1[len1-1-i] - '0';

/* 不過,字元陣列內的數字與陣列內數字順序相反,這與乘法原理有關,根據ascii,字元陣列內的數字要轉化成實際的數字,就要減去48,因為『0』的ascii碼恰好是48,所以將字元陣列元素-『0』以實現轉化 */

for (int j = 0; j < len2; j++) // 用for迴圈,實現字元陣列b1內數字向陣列轉移

b[j] = b1[len1-1-j] - '0';

for (int i = 0; i < len1; i++) // 接下來這兩個巢狀的for迴圈便是高精度乘法的核心

for (int j = 0; j < len2; j++) // 此處第

一、第二個式子用+=,原因可根據乘法原理解釋,第三個式子無需+=,原因是取該位數總值的個位即可

if (c[len-1] == 0) // 此處是判斷輸出的第乙個數字是否為0,若為0,忽略該位數,即總長減去1

len--;

for (int i = len-1; i >= 0; i--) // 倒著輸出陣列內的數字,得到最終結果

printf("%d", c[i]);

return 0;

}

pps:

1.&n

2.ans = ans * 2;

3.ans > 1000000000000000000(18位)

4.%lld

#include

int main()

}while(ans > 10000000000)

printf("%lld",ans);

return 0;

}

高精度的乘法應用

對於乙個實數r 0 include include using namespace std char str 10 int n,dot int res 99999 a 99999 b 99999 int la,lb void mul if res la lb 1 9 la la lb for i 1...

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

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

C語言中的高精度乘法

4整體的 5結語 我們知道,計算機內部直接用int或double等資料型別儲存數字是有範圍限制的,即當資料運算大小過大後,計算機將會出現溢位情況,使得計算結果不夠精確。為了能夠使計算機精確地計算高位的數字,我們需要學會使用高精度乘法。事實上,高精度乘法就是通過程式設計的方法,把我們小學時候簡單的數學...