判断Armstrong数时输出异常:本地运行结果一致,在线编译正常
解决Armstrong数判断代码本地运行结果异常的问题
问题根源是你用了pow函数计算数字的幂,而pow返回的是double浮点数类型,直接加到int类型的sum里会因为浮点数精度问题出错:
- 比如计算
pow(2,3)时,实际返回的可能是7.9999999999而非精确的8,隐式转成int后就变成了7,导致最终的sum计算完全错误。 - 在线编译器的数学库实现可能刚好让
pow的结果更接近整数,所以能正常运行,但本地环境的库没这个“运气”。
修复方案1:用整数运算实现幂计算(最可靠)
完全避开浮点数,手动计算每个数字的幂:
#include <stdio.h> int main() { int originalNum, num, lastDigit, digits, sum; printf("Enter any number to check Armstrong number: "); scanf("%d", &num); sum = 0; originalNum = num; // 统计数字的位数 for (digits = 0; originalNum > 0; digits++) { originalNum /= 10; } originalNum = num; // 计算各位数字的digits次幂之和 while (originalNum > 0) { lastDigit = originalNum % 10; // 手动计算整数幂 int power = 1; for (int i = 0; i < digits; i++) { power *= lastDigit; } sum += power; originalNum /= 10; } if (sum == num) { printf("%d is an Armstrong number.\n", num); } else { printf("%d is not an Armstrong number.\n", num); } return 0; }
修复方案2:修正浮点数精度误差
如果不想改太多代码,可以对pow的结果做取整修正,把sum += pow(lastDigit, digits);改成:
sum += (int)(pow(lastDigit, digits) + 0.5);
加0.5后再强制转int,能把7.999999这类接近整数的浮点数修正为正确的8。
内容的提问来源于stack exchange,提问作者Jealous Garlic
相关产品推荐
相关产品推荐

