Bailian2981 大整數加法【大數】(POJ NOI0106-10)
阿新 • • 發佈:2019-01-11
描述
求兩個不超過200位的非負整數的和。
輸入有兩行,每行是一個不超過200位的非負整數,可能有多餘的前導0。輸出一行,即相加後的結果。結果裡不能有多餘的前導0,即如果結果是342,那麼就不能輸出為0342。樣例輸入22222222222222222222 33333333333333333333樣例輸出
55555555555555555555
問題簡述:(略)
問題分析:
這是一個加法計算問題,但是給的數位數多,可能達到10000位,超出了所有整數型別能夠表示的範圍。
大數計算一種是構建一個大數類進行計算,另外一種是直接計算。
人們使用阿拉伯數字,據說是印度人發明的。需要注意的一點是, 阿拉伯數字的高位在左邊,閱讀上是從左到右,而計算上人們則是從低位算起。
大數可以放在陣列中,為了計算上的方便,應該把低位放在下標小的地方,高位放在下標大的地方。
讀入的數可以放在字元陣列或字串變數中,高位在左低位在右。
程式說明:程式採用直接模擬計算。需要注意的是輸出結果前需要去除前導的0。
題記:
使用巨集定義可以使得程式碼可閱讀性增強。
加法計算需要考慮進位,實際上每一位的加法是三個數相加。
參考連結:(略)
AC的C語言程式如下:
/* Bailian2981 大整數加法 */ #include <stdio.h> #include <string.h> #define BASE 10 #define N 200 char a[N+1], b[N+1]; char ans[N+1]; int main(void) { int anslen, carry, len, i, j; scanf("%s", a); scanf("%s", b); memset(ans, 0, sizeof(ans)); anslen = len = strlen(a); for(i=len-1, j=0; i>=0; i--) ans[j++] = a[i] - '0'; len = strlen(b); if(len > anslen) anslen = len; carry = 0; for(i=len-1, j=0; i>=0; i--,j++) { ans[j] += b[i] - '0' + carry; carry = ans[j] / BASE; ans[j] %= BASE; } while(carry > 0) { ans[j] += carry; carry = ans[j] / BASE; ans[j++] %= BASE; } if(j > anslen) anslen = j; /* 去除前導的多個0 */ for(i=anslen-1; i>=0; i--) if(ans[i]) break; if(i < 0) i = 0; /* 輸出結果 */ for(; i>=0; i--) printf("%d", ans[i]); printf("\n"); return 0; }