Armstrong数识别代码异常:每次判定为非Armstrong数
问题分析与修复
你的代码存在两个核心问题,导致无法正确判定Armstrong数:
位数统计时修改了原始num的值
第一个循环用于统计数字位数,但直接修改了num,导致后续求和循环只能处理剩下的最后一位数字,而非原始数字的所有位数。例如输入153,统计位数后num会变成1,求和循环仅计算1³,完全遗漏了5³和3³。pow()函数的浮点精度误差pow()是浮点运算函数,返回的double类型值可能存在精度偏差。比如pow(5,3)可能返回124.999999999而非精确的125,强制转换为int时会被截断为124,直接导致求和结果错误。
修复后的代码
#include <stdio.h> // 手动计算整数幂,彻底避免浮点精度问题 int integer_power(int base, int exponent) { int result = 1; for (int i = 0; i < exponent; i++) { result *= base; } return result; } int main() { int num, original_num, sum = 0, lastdigit, digit_count = 0; printf("Enter the number: "); scanf("%d", &num); original_num = num; // 使用临时变量统计位数,不修改原始num int temp_num = num; while (temp_num != 0) { digit_count++; temp_num /= 10; } // 重置num为原始值,开始逐位求和 num = original_num; while (num > 0) { lastdigit = num % 10; sum += integer_power(lastdigit, digit_count); num /= 10; } if (original_num == sum) { printf("The number is an ARMSTRONG number\n"); } else { printf("The number is not a ARMSTRONG number\n"); } return 0; }
修复说明
- 位数统计优化:用临时变量
temp_num统计位数,保留原始num的值用于后续求和。 - 整数幂实现:自定义
integer_power函数通过循环计算整数幂,完全规避浮点运算的精度问题。 - 逻辑修正:确保求和循环遍历原始数字的每一位,计算所有位的幂次和。
内容的提问来源于stack exchange,提问作者ario
相关产品推荐
相关产品推荐

