競賽拙見 2 高精度運算 大資料加法

2021-10-22 07:24:57 字數 1400 閱讀 8140

在競賽題中,求兩位數的和看似非常簡單,但是當我們興致勃勃地把自己不經過大腦思考就寫出的**提交上去的時候竟發現乙個測試點都沒有通過。

問題到底出現在**呢?

這就涉及到了高精度運算的問題。

通常我們知道,類似int、double這樣的資料型別都有各自的精度範圍,但是當我們計算乙個特別大的資料的時候往往都會超出這個精度範圍,所以我們需要乙個方法來解決這個問題。

在我們小學開始學習加法運算的時候,我們用的是筆算的方法,而這個方法在計算機中用陣列來模擬出來。

我們可以把兩個要相加的數分別放在兩個陣列中,但是為了方便遍歷陣列計算,我們可以把資料在陣列中逆序排放,以123+456為例,我們分別把123和456放在陣列x和y中:

之後通過對陣列模擬筆算時的進製操作,把計算後的資料再放到sum陣列中就可以得到正確結果,**實現如下:

首先我們需要將資料當作字串輸入,然後再把字串-『0』得到數字存放在陣列中。其中需要注意的是len代表運算結果的總長度,取x和y中最大的乙個再+1以防止進製溢位;

string s1,s2;

int x[maxn],y[maxn],sum[maxn];

memset(x,0,sizeof(x));

memset(y,0,sizeof(y));

memset(sum,0,sizeof(sum));

cin>>s1>>s2;

int len_x=s1.size();

int len_y=s2.size();

int len=max(len_x,len_y)+1;

for(int i=0;i在從陣列的第0位開始計算的時候,就要考慮進製的問題,遇到大於10的,在後一位加一表示進製;

for(int i=0;i=10)

}

最後通過判斷len的最後一位是否有進製或者是計算的是0+0的問題,來輸出最終結果;

if(sum[len-1]==0 && len>1)

for(int i=len-1;i>=0;i--) }

if(sum[len-1]==0 && len>1)

for(int i=len-1;i>=0;i--){

cout<運算結果示例:

注意:大資料加法的運算的重點主要在於把資料如何存放在陣列中,並利用陣列進行計算,只要把這個問題想通,這個加法就是十分基礎的問題了。

高精度運算(大數加法)

在計算過大的數字時,我們可以使用字串進行儲存,再模擬計算過程,結果也用字串儲存,最後輸出這個字串 加法 include include include includeusing namespace std int main l1 l2 int g 0 while l2 0 while l1 0 if...

高精度 大數加法

1.p1601 a b problem 高精 題目描述 高精度加法,相當於a b problem,不用考慮負數.輸入格式 分兩行輸入。a,b a,b 10 500 輸出格式 輸出只有一行,代表a b的值 輸入輸出樣例 輸入1001 9099輸出 10100分析 include include inc...

彙編 大數加法 or 高精度加法

部落格目錄 開發環境 emu8086 v3.05 可變長度,以乙個十進位制位佔乙個位元組。make com com file is loaded at cs 0100h org 100h jmp start sta db 200 dump sum db 6 dump coa db 9,2,5,6,2...