问题描述
我搜索了我尝试过的所有内容,但找不到我需要的答案。
我正在用 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,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”的地方,并从那里打印出来。
我给这个程序添加了数字,一切正常。但是当我提交这段代码进行判断时,却显示超出输出限制,这是为什么呢?
如果我的英语不好,或者问题太愚蠢,我很抱歉。谢谢。
解决方法
填充说明符 %0
仅适用于数值,不适用于字符串。您可以按如下方式破解它:
sprintf(a,"%0*d%s",10000-(int)strlen(tem1),tem1);
sprintf(b,10000-(int)strlen(tem2),tem2);
printf("%*d",w,v)
是打印宽度为 v
的 w
。