该程序最多可以工作9位数,并且在10位数时失败

时间:2013-10-22 15:51:37

标签: c variables int long-integer

这适用于许多情况,其中大多数变量是整数,除非我想找到添加到45的所有10位数字,然后它只给我输出零。然后,我将所有变量更改为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;
}

3 个答案:

答案 0 :(得分:3)

不提供您的代码只是粗略的检查,它必须是因为达到intlong的限制,这可能是您平台上的32位。 (并且32位数的最大大小为10位数。)

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

答案 1 :(得分:2)

int和long的大小取决于你编程的内容,因此你无法确定它们使用了多少位(它们都可以是32位)。您可以尝试使用inttypes.h中的库,它允许您使用int64_t。这样你肯定知道你的变量是64位,应该足够大。祝你好运!

答案 2 :(得分:0)

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

所以这里最简单的事情就是让一个人可能只是“手动”(一个简单的for循环)将所需的功率提高到10,并使用64位类型,因为其他人建议能够代表更多位数。

(请注意,虽然您可能会尝试对pow的结果进行舍入,但是对于较大的数字,它可能会在最低位数上失去准确性,并且您将再次达到使循环运行不正确的时间点)