1. 程式人生 > >Bailian2981 大整數加法【大數】(POJ NOI0106-10)

Bailian2981 大整數加法【大數】(POJ NOI0106-10)

大整數加法

描述

求兩個不超過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;
}