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;}