【问题标题】:What is the problem with my add big number code?我的添加大数字代码有什么问题?
【发布时间】: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(您目前没有使用)。坦率地说,这里有很多工作是不必要的。

标签: c bignum


【解决方案1】:

填充说明符%0 仅适用于数值,不适用于字符串。您可以按以下方式破解它:

sprintf(a, "%0*d%s", 10000-(int)strlen(tem1), 0, tem1);
sprintf(b, "%0*d%s", 10000-(int)strlen(tem2), 0, tem2);

printf("%*d", w, v) 是打印v,宽度为w

【讨论】:

  • tem1 有 10000 个(或更多)字符时,这将不起作用
  • @4386427 是的,但它与OP无关。
  • @4386427 在这种情况下,您应该发布一些有用的东西。从 OP 来看,很明显它来自一些 C 课程的介绍,但您只是想传播一些 C 安全编码指南。对初学者也没有帮助。恕我直言,对于开始学习 C 的人来说,首先要知道错误在哪里,如何让它工作,它是如何工作的。当您更有经验时,会考虑性能、安全性等。
猜你喜欢
  • 1970-01-01
  • 2011-07-28
  • 1970-01-01
  • 1970-01-01
  • 2019-06-06
相关资源
最近更新 更多