我检查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("nnThe 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("nt The original number is : %d", n1); printf("nt The calculated number is: %d", sum); if(n1==sum) printf("nt%d is an armstrong numbern", n1); else printf("nt%d is not an armstrong numbern", n1); return 0; }
程序在进行数学运算时得到152 ,因此输出错误。 我已经打印了每一步以找到确切的错误点。
问题是,它将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,因为它将转换为完美的浮点精度。
以上就是c/c++开发分享程序到阿姆斯特朗’n’数字的数字只给出了错误的输出153相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/546007.html