程序到阿姆斯特朗’n’数字的数字只给出了错误的输出153

我检查Armstrong’n’数字的程序输出错误,仅在输入为153时。

这是我的代码。

#include #include 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 ,因此输出错误。 我已经打印了每一步以找到确切的错误点。

  • 我使用了power函数而不是for循环
  • 我不能使用t * t * t,因为这个程序是针对阿姆斯壮的“n”数字,而不仅仅是3
  • 我正在使用代码块16.01编译程序

问题是,它将5的立方体计算为124

有趣的是,当我使用幂函数在一个单独的简单程序中计算5的立方体时,我得到了正确的答案(125)

我还检查了这里给出的代码 – > https://www.programiz.com/c-programming/examples/check-armstrong-number ,它也提供了错误的输出。 我在本网站上找到的有些类似问题的答案并没有解决问题。

好吧,我无法重现上述问题。 我确实得到了输入153的正确结果,即它是阿姆斯壮的数字。

由于使用pow它可能是一些浮点舍入错误(尽管在这种特定情况下我会发现这很奇怪)。

对于像这样的任务,您不应该使用浮点。 使用可用的最大整数类型。 您不仅可以避免令人讨厌的舍入错误,还可以增加程序可以处理的输入值范围。

所以,我想解决这个问题:

我不能使用t * t * t,因为这个程序是针对阿姆斯壮的“n”数字,而不仅仅是3

您可以轻松编写一个使用整数数学计算t^n的函数。 这是一个例子:

 #include uint64_t intpow(uint64_t t, uint64_t p) { uint64_t result = 1; while(p>0) { result = result * t; --p; } return result; } 

注意:在当前forms中,函数缺少溢出检测,因为我想保持函数简单。

有两种方法可以解决。 1)使用round()函数,它将给出最接近的整数(因为在代码块中的浮点计算中存在一些错误)。

2)将sum变量声明为float或double,因为它将转换为完美的浮点精度。