问题描述
原题:HDO 1002 A + B Problem II用C++调试并提交不会出现错误。用c语言提交提示'wrong', 结果调试发现:当第二个加数长度超过19个0,后面的0变成了48?(如下)
0 + 0000000000000000000 = 00 + 00000000000000000000 = 48 0 + 000000000000000000000 = 4848

#include<stdio.h>#include<string.h>#define maxn 1005char a[maxn], b[maxn], c[maxn]; // 加数1,加数2,和void f(char *a, char *b){ int p, q = 0, k, s, i; k = strlen(a) - 1; // 加数a的最大索引 s = strlen(b) - 1; // 加数b的最大索引 i = maxn; while (k >= 0 || s >= 0) { if (k < 0) a[k] = ’0’; // 把数字前面的0变为‘0’if (s < 0) b[s] = ’0’; // 把数字前面的0变为‘0’p = a[k] - 48 + b[s] - 48 + q;c[i] = p % 10; // c[i]:当前位的和printf('c[%d]=%dn',i,c[i]); // 这里是调试加上的q = p / 10; // q:当前进位k--; s--;i--; } //printf('c[0]==%dn',c[0]); c[i] += q; for (i = 0; i < maxn; i++) //丢掉前面的零,保留最高位的最高位maxn的零,为了0+0if (c[i]) break;//找到开始有效位 printf('i=%dn',i); // 这里是调试加上的 for (; i <= maxn; i++)//从有效位开始,包含最高位全部输出printf('%d', c[i]); printf('n');}int main(){ int n, l = 1, m; scanf('%d', &n); m = n; while (n--) {memset(a, 0, sizeof(a)); // 每组测试前先置空数组memset(b, 0, sizeof(b));memset(c, 0, sizeof(c));scanf('%s%s', a, b);printf('Case %d:n', l++);printf('%s + %s = ', a, b);f(a, b);if (n > 0) printf('n'); } return 0;}
问题解答
回答1:你定义数组是1005个元素,而你实际调用过程中多次直接调用c[1005],比如第一次运行这个时候:
i = maxn; while (k >= 0 || s >= 0) { if (k < 0) a[k] = ’0’; // 把数字前面的0变为‘0’if (s < 0) b[s] = ’0’; // 把数字前面的0变为‘0’p = a[k] - 48 + b[s] - 48 + q;c[i] = p % 10; // c[i]:当前位的和 // c[1005]
这句也是要打印到c[1005]
for (; i <= maxn; i++)//从有效位开始,包含最高位全部输出printf('%d', c[i]);
试试先修改这些地方,看是不是会变好些。

