检查Armstrong'n'个数字的程序输出错误,仅在输入为153时。
这是我的代码。
#include<stdio.h>
#include<math.h>
int main()
{
int p, k, n, t, sum, n1, m;
printf("Enter the number: ");
scanf("%d", &n);
n1=n;
for(p=0, k=1; n/k>=1; ++p, k*=10);
printf("\nThe number of digits: %d", p);
for(sum=0; n>0; n/=10)
{
t= n%10;
printf("\n\nThe base and power: %d and %d", t, p);
m=pow(t, p);
printf("\nThe calculated no is: %d", m);
sum+=pow(t, p);
printf("\nThe sum is: %d", sum);
}
printf("\n\t The original number is : %d", n1);
printf("\n\t The calculated number is: %d", sum);
if(n1==sum)
printf("\n\t%d is an armstrong number\n", n1);
else
printf("\n\t%d is not an armstrong number\n", n1);
return 0;
}
程序在进行数学计算时会 152 ,因此输出错误。我打印了每一步都找到了确切的错误点。
问题是,它正在计算5的立方体为124 。
有趣的是,当我使用power函数在一个单独的简单程序中计算5的立方体时,我得到正确答案(125)。
我还检查了这里给出的代码 - &gt; https://www.programiz.com/c-programming/examples/check-armstrong-number,它也提供了错误的输出。我在本网站上找到的有些类似问题的答案并未解决问题。
答案 0 :(得分:3)
好吧,我无法重现上述问题。我确实得到了输入153的正确结果,即它是阿姆斯壮的数字。
由于使用pow
,可能会出现一些浮点舍入错误(尽管在这种特定情况下我会发现这很奇怪)。
对于像这样的任务,你应该不使用浮点数。使用可用的最大整数类型。您不仅可以避免令人讨厌的舍入错误,还可以增加程序可以处理的输入值范围。
所以,我想谈谈这部分:
我不能使用t * t * t,因为这个程序适用于阿姆斯壮的“n”数字,而不仅仅是3个
您可以轻松编写使用整数数学计算t^n
的函数。这是一个例子:
#include<inttypes.h>
uint64_t intpow(uint64_t t, uint64_t p)
{
uint64_t result = 1;
while(p>0)
{
result = result * t;
--p;
}
return result;
}
注意:在当前形式下,函数缺少溢出检测,因为我想保持函数简单。
答案 1 :(得分:0)
有两种解决方法。 1)使用round()函数将给出最接近的整数(因为代码块中的浮点计算存在一些错误)。
2)将sum变量声明为float或double,因为它将转换为完美的浮点精度。