0

这适用于许多情况,其中大多数变量都是整数,除非我想找到所有 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;
}
4

3 回答 3

3

如果只是粗略地检查一下您的代码,那一定是由于达到了intor的限制,long在您的平台上可能是 32 位。(并且 32 位数字的最大长度为 10 位)。

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

于 2013-10-22T15:54:24.350 回答
2

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

于 2013-10-22T15:58:40.060 回答
0

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

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

(请注意,尽管您可能会尝试对 pow 的结果进行适当的舍入,但如果数字很大,它可能会在最低位上失去准确性,并且您会再次到达您运行循环不正确时间的地步)

于 2013-10-22T16:47:27.787 回答