Problem-1002 : A + B Problem II

来源:互联网 发布:淘宝店铺品牌授权 编辑:程序博客网 时间:2024/05/16 10:06
/****************************************************************************************Problem DescriptionI have a very simple problem for you. Given two integers A and B, your job is tocalculate the Sum of A + B.InputThe first line of the input contains an integer T(1<=T<=20) which means the numberof test cases. Then T lines follow, each line consists of two positive integers,A and B. Notice that the integers are very large, that means you should not processthem by using 32-bit integer. You may assume the length of each integer will notexceed 1000.OutputFor each test case, you should output two lines. The first line is "Case #:", #means the number of the test case. The second line is the an equation "A + B = Sum",Sum means the result of A + B. Note there are some spaces int the equation. Output ablank line between two test cases.Sample Input21 2112233445566778899 998877665544332211Sample OutputCase 1:1 + 2 = 3Case 2:112233445566778899 + 998877665544332211 = 1111111111111111110****************************************************************************************/#include <stdio.h>#include <string.h>int main (void){    char a[1000], b[1000], c[1001];        // 最高位和可能会进位, 所以要多一字节存进位.    int n, i, j, k;    int alength, blength, clength;    char carry = 0;                        // 进位标识, 只可能是1/0    while(scanf("%d", &n) != EOF)    {        for (i = 0; i < n; i++)            // 处理 n 组数        {            memset(a, 0, sizeof(a));       // 将所有分配的内存置 0.            memset(b, 0, sizeof(b));            memset(c, 0, sizeof(c));            scanf("%s %s", a, b);          // 输入第 1 和 2 两数.            printf("Case %d:\n", i + 1);            alength = strlen(a);           // 获取数字长度            blength = strlen(b);            clength = (alength >= blength) ? alength : blength;            for (j = alength - 1, k = blength - 1; j >= 0 && k >= 0; j--, k--)            {                if (a[j] + b[k] - '0' + carry > '9') {                    c[clength--] = (a[j] - '0' + b[k] - '0' + carry) % 10 + '0';                    carry = 1;                } else {                    c[clength--] = (a[j] - '0' + b[k] - '0' + carry) % 10 + '0';                    carry = 0;                }            }            while (j >= 0) {               // 当 a[] 比 b[] 长时                if (a[j] + carry > '9') {                    c[clength--] = (a[j--] + carry - '0') % 10 + '0';                    carry = 1;                } else {                    c[clength--] =  a[j--] + carry;                    carry = 0;                }            }            while (k >= 0) {               // 当 b[] 比 a[] 长时                if (b[k] + carry > '9') {                    c[clength--] = (b[k--] + carry - '0') % 10 + '0';                    carry = 1;                } else {                    c[clength--] =  b[k--] + carry;                    carry = 0;                }            }            c[0] = carry + '0';            k = 0;                         // 就不多定义变量了, 复用吧.            while (c[k] == '0') {          // 去除结果中的前导 0.                k++;            }            if (c[k] != '\0')              // 不全是 0 的情况            {                printf("%s + %s = %s\n", a, b, c + k);            } else {                       // 全部是 '0' 的情况.                printf("%s + %s = %s\n", a, b, c + k - 1);            }            if (i != n - 1) {               // 要求是两个结果之间有空行, 最后一个输出结果没空格, 坑爹                printf("\n");            }            carry = 0;                     // 处理下组数之前将进位位清零        }    }    return 0;}

原创粉丝点击