C语言阿姆斯特朗数判断代码故障:所有输入均返回非阿姆斯特朗数
阿姆斯特朗数判断代码的问题修复
你的代码有三个核心问题,导致无论输入什么数字都返回“not armstrong”,下面逐一说明并给出修复方案:
1. 变量重复定义导致sum值异常
在check_armstrong函数中,你先在函数开头声明了int sum;,又在for循环的初始化部分重新定义了int sum = 0;。循环内的sum是局部于循环的变量,循环结束后,函数上层的sum仍是未初始化的垃圾值,和输入数字比较永远不相等,因此始终返回false。
修复方式:删除循环内的int关键字,在函数开头直接初始化sum:
bool check_armstrong(int num, int num_length) { int sum = 0; // 移到此处初始化 int digit = 0; int temp_num = num; for (; temp_num != 0;) // 移除循环内的int sum定义 { digit = temp_num % 10; temp_num /= 10; sum += pow(digit, num_length); } return sum == num; }
2. pow函数的精度误差问题
pow是返回double类型的数学库函数,计算整数幂时可能出现精度偏差。比如pow(3,3)可能返回26.9999999999,强制转换为int后会变成26,而非预期的27,导致sum计算错误。
修复方式:实现一个整数幂计算函数替代pow:
// 新增整数幂计算函数 int int_power(int base, int exp) { int result = 1; for (int i = 0; i < exp; i++) { result *= base; } return result; }
然后在check_armstrong中替换pow调用:
sum += int_power(digit, num_length);
3. 未处理输入为0的情况
count_digits函数在输入为0时会返回0,但0是阿姆斯特朗数(0^1=0),此时代码会错误判断它不是。
修复方式:修改count_digits函数,单独处理num为0的情况:
int count_digits(int num) { if (num == 0) return 1; int count; for (count = 0; num != 0; count++) { num /= 10; } return count; }
修复后的完整代码
#include <stdio.h> #include <conio.h> #include <stdbool.h> int count_digits(int num) { if (num == 0) return 1; int count; for (count = 0; num != 0; count++) { num /= 10; } return count; } int int_power(int base, int exp) { int result = 1; for (int i = 0; i < exp; i++) { result *= base; } return result; } bool check_armstrong(int num, int num_length) { int sum = 0; int digit = 0; int temp_num = num; for (; temp_num != 0;) { digit = temp_num % 10; temp_num /= 10; sum += int_power(digit, num_length); } return sum == num; } int main() { int input_num; printf("Enter a number: "); scanf("%d", &input_num); if (check_armstrong(input_num, count_digits(input_num))) { printf("It is an armstrong number."); } else { printf("It is not an armstrong number."); } getch(); return 0; }
内容的提问来源于stack exchange,提问作者Starblaze
相关产品推荐
相关产品推荐

