一本通 高精度計算

2021-10-21 05:59:42 字數 2704 閱讀 1814

加法進製: 下標低位是個位,高位是十位、百位。輸出的時候倒著輸出。計算著時候必須先儲存個位

c[i] = a[i] + b[i];

if(c[i] >= 10)

減法進製: a[i]-b[i]

if(a[i] < b[i])

c[i] = a[i] - b[i];

乘法進製: 看不懂,下面會解釋

e[i+j-1] = c[i] * d[j] + e[i+j-1]; //新計算的值+累計原位置的值

if(e[i+j-1] >= 10)

個位存在前面比較好,容易進製。如果個位存在後面,前面產生進製,就需要整體後移。求兩個不超過200位的非負整數的和。

有兩行,每行是乙個不超過200位的非負整數,可能有多餘的前導0。

一行,即相加後的結果。結果裡不能有多餘的前導0,即如果結果是342,那麼就不能輸出為0342。

22222222222222222222

33333333333333333333

55555555555555555555
#include using namespace std;

const int maxn = 205;

char m[maxn],n[maxn];

int a[maxn],b[maxn],c[maxn];

int main(int argc, char const *ar**)

} //去除c的後置0

int p = maxn-1;

while(c[p] == 0)

for(int i = p; i >= 0; i--) cout << c[i];

return 0;

}

求兩個大的正整數相減的差。

共2行,第1行是被減數a,第2行是減數b(a > b)。每個大整數不超過200位,不會有多餘的前導零。

一行,即所求的差。

9999999999999999999999999999999999999

9999999999999

9999999999999999999999990000000000000
#include using namespace std;

const int maxn = 205;

char a[maxn],b[maxn];

int c[maxn],d[maxn],e[maxn];

int main(int argc, char const *ar**)

} int p = maxn;

while(e[p] == 0) p--;

for(int i = p; i >= 0; i--)

return 0;

}

c[i] 與 a[i]*b[j]的乘積、進製、原來的c[i]有關

}做除法時,每一次的商的值都在0~9,每次求得的餘數連線以後的若干位得到的新的被除數,繼續做除法。因此,在做高精度除法時,要涉及到乘法運算和減法運算,還有移位處理。

當然為了程式簡潔,可以避免高精度乘法,用0~9次迴圈減法取代商的值。

這裡,我們討論一下高精度數除以當精度數的結果,採取的方法是按位相除法。

}實質上,在做高精度數運算的時候,儲存高精度數的陣列元素可以不僅僅只保留一位數字,而可以採取保留多位數,這樣,在做運算,特別是乘法運算時,可以減少很多操作。

用減法模擬除法,對被除數的每一位都減去除數,一直減到當前位置的數字(包含前面的餘數)小於除數。

有點難。暫且放下

C 奧賽一本通刷題高精度題解

title c 奧賽一本通刷題記錄 高精度 date 2017 11 15 tags c 奧賽一本通刷題記錄 高精度 2017.11.15 by gwj1139177410 大整數加法 openjudge10 add template include include include using na...

佇列(一本通)

這道題重點是關係的轉換和初始化 include include include includeusing namespace std int a 101 記錄接著的的那個節點 int n,m int main int ans void bfs int x,int y int main cout in...

一本通1083 計算星期幾

假設今天是星期日,那麼過abab 天之後是星期幾?兩個正整數a a,b b,中間用單個空格隔開。0 100,010000 0。乙個字串,代表過a b a b天之後是星期幾。其中,mon day monday是星期一,tue sday tuesday是星期二,wed nesd ay wednesday...