【问题标题】:The program works fine upto 9 digit numbers and fails at 10 digit该程序对 9 位数的数字工作正常,在 10 位数时失败
【发布时间】:2013-10-31 14:31:12
【问题描述】:

这在许多情况下都有效,其中大多数变量都是整数,除非我想找到所有 10 位数字加起来,比如 45,然后它只给我一个零输出。然后,我将所有变量更改为 longs 以查看是否会有所作为,但事实并非如此。关于我应该做什么或目前做错了什么的任何想法?

感谢任何帮助。

我的程序如下:

long add_digits(long);
int main()
{
  long digit, i, j, limit, l, n, sum=0, rem, result, counter=1;
    printf("\nInput digits: ");
    scanf("%d", &j);
    printf("\nInput number: ");
    scanf("%d", &i);
    limit=pow(10,j);
    for(n=1; n<limit; n++)
    {
        result = add_digits(n);
        if(result==i)
             counter++;

        }
    printf("\n%d\n", counter-1);
  return 0;
}
long add_digits(long n)
{
  static long sum = 0;
  if (n == 0) {
    return 0;
  }
  sum = n%10 + add_digits(n/10);
  return sum;
}

【问题讨论】:

  • 您是否尝试过使用powl 代替longs 而不是pow 用于doubles ?
  • 您正在经历一百亿个数字。这对于现代 PC 来说只是小菜一碟,但想象一下您的方法适用于 100 位数字。不会工作那么快,是吗?不谈电费。有可能做得更好。
  • 顺便说一句:建议从 static long sum = 0; 中删除 static

标签: c variables int long-integer


【解决方案1】:

除了粗略地检查您的代码之外,它一定是由于达到了intlong 的限制,这在您的平台上可能是 32 位。 (并且 32 位数字的最大长度为 10 位)。

为什么不使用int64_t,它始终是 64 位,并且自 C99 以来是标准的? pow 也可能会给你带来麻烦;但是你可以构建一个快速而肮脏的乘以 10 几次来消除这种可能性。

【讨论】:

    【解决方案2】:

    int 和 long 的大小取决于您对其进行编程的目的,因此您无法确定它们使用了多少位(它们都可能是 32 位)。您可以尝试使用库 inttypes.h,它可以让您使用 int64_t。这样你就可以确定你的变量是 64 位的并且应该足够大。祝你好运!

    【讨论】:

      【解决方案3】:

      正如其他人指出的那样,pow() 电话是解决您问题的关键。它在double 上运行,返回double,然后您可能将结果放在您平台上的32 位整数中。 10^10 不适合 32 位,这是您问题的一部分。另一部分是准确性:如果你只是让一个 int 等于一个 double,那么你很可能会遇到something like in this question

      因此,在这里要做的最简单的事情可能只是“手动”将 10 提高到请求的功率(一个简单的for 循环),并使用 64 位类型,因为其他人建议能够表示更多数字。

      (请注意,尽管您可能会尝试将 pow 的结果四舍五入,但对于大数字,它可能会失去最低数字的准确性,并且您会再次遇到运行循环不正确的时间)

      【讨论】:

        猜你喜欢
        • 2015-04-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多