2011年11月26日 星期六

大數加法

}內容 :
輸入檔案包含 N 行數字,每個數字皆為非負整數,且位數小於 100 位。
}輸入說明 :
每讀取兩個數字後印出加法後的結果
}範例輸入 :
123456789
01
5566
7788
3141592653589793
2718281828459045
}範例輸出 :
123456790
13354
5859874482048838


#Code
#include <stdio.h>
#include <string.h>

void reverse(char * n, int len)
{
    int i, temp;

    for (i = 0; i < len/2; i++)
    {
        temp = n[i];
        n[i] = n[len-i-1];
        n[len-i-1] = temp;
    }
}

int main(void)
{
    char n1[100], n2[100], rs[101], carry;
    int i, len1, len2, temp, len;

    while (scanf("%s %s",n1, n2) == 2)
    {
        len1 = strlen(n1);
        len2 = strlen(n2);
        reverse(n1, len1);
        reverse(n2, len2);

        for (i = len1; i < 100; i++)
            n1[i] = '0';
        for (i = len2; i < 100; i++)
            n2[i] = '0';
        for (i = 0; i < 101; i++)
            rs[i] = '0';
        carry = 0;
        for (i = 0; i < 100; i++)
        {
            temp = (n1[i] - '0') + (n2[i] - '0') + carry;
            rs[i] += temp % 10;
            carry = temp / 10;
        }
        if (carry > 0)
            rs[100] += carry;
        while (i >= 0 && rs[i] == '0')
            i--;
        if (i == -1)
            printf("0");
        else
            for (; i >= 0; i--)
                putchar(rs[i]);
        printf("\n");
    }

    return 0;
}

沒有留言:

張貼留言