【发布时间】:2020-12-29 05:46:29
【问题描述】:
我搜索了我尝试的所有内容,但找不到我需要的答案。
我正在用 C 语言解决一个名为“Big Number A+B”的问题。 A和B的最大值是10^10000所以我用unsigned long long解决不了,所以我尝试用char数组添加。
#include <stdio.h>
int main(void) {
char tem1[10001], tem2[10001];
char a[10001], b[10001], res[10002] = "";
int carry = 0, sum = 0;
scanf("%s%s", tem1, tem2);
sprintf(a, "%010000s", tem1);
sprintf(b, "%010000s", tem2);
for (int i = 9999; i >= 0; i--) {
sum = (a[i] - 48) + (b[i] - 48) + carry;
carry = sum / 10;
sum = sum % 10;
res[i + 1] = sum + 48;
}
res[0] = carry + 48;
int start = 0;
while (res[start] == 48) {
start++;
}
puts(res + start);
return 0;
}
我声明了 5 个char 数组,两个用于临时保存数字,两个用于添加数字,但我在前面放了零以使长度正好为 10000,最后用于保存结果。
因为输入是单行的两个整数,所以我使用scanf 来读取它们。在sprintf 中,我输入零以使长度为10000。然后在for 循环中,我添加了a[i]、b[i] 和carry,并使用mod 10 将字符保存到数组res。跳出循环后,我将最后一个进位复制到res[0]。
实际添加完成,但结果前面可能有零,所以我找到了字符不是“0”的地方,并从那里打印出来。
我在这个程序中输入了数字,一切正常。但是我提交这段代码判断的时候,提示Output Limit Exceeded,这是为什么呢?
如果我的英语不好,或者问题太愚蠢,我很抱歉。谢谢。
【问题讨论】:
-
请不要使用magic numbers。如果
48是指数字零的 ASCII 值,请改用实际字符'0'。 -
我假设“法官”是某种在线平台,哪个?是否有某种特定的格式希望打印出答案?
-
感谢您的提示。我会尝试使用实际的字符值。
-
我的编译器抱怨 “标记 '0' 会导致带有 's' 转换说明符的未定义行为”。 C标准同意这一点。因此,法官可能不会按照您期望的方式对字符串进行零填充。找到一种不同的方法来对字符串进行零填充。
-
我建议您阅读您的
scanf文档,并且 (a) 确保您的目标缓冲区没有被破坏 (%10000s) 并使用两个scanf调用,而不是一个调用来利用该值使用%n(您目前没有使用)。坦率地说,这里有很多工作是不必要的。