这适用于许多情况,其中大多数变量是整数,除非我想找到添加到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;
}
答案 0 :(得分:3)
不提供您的代码只是粗略的检查,它必须是因为达到int
或long
的限制,这可能是您平台上的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的结果进行舍入,但是对于较大的数字,它可能会在最低位数上失去准确性,并且您将再次达到使循环运行不正确的时间点)