C语言区间Armstrong数查找代码调试求助:逻辑错误排查
排查C语言Armstrong数程序的逻辑错误
存在的核心错误分析
位数计算函数逻辑错误
原digit函数通过pow(10,i)取余判断位数的逻辑完全不成立,且依赖浮点数的pow函数存在精度风险:比如pow(10,2)可能因精度问题返回99.999999,强制转int后变成99,导致153%99=54≠153,循环会错误地继续执行,最终返回错误的位数。正确的位数计算应该用整数除法循环实现。累加和未初始化
is_armstrong函数中的sum没有初始化为0,每次调用时sum会是内存中的随机垃圾值,这是153无法被识别的关键原因之一。硬编码3次方不符合Armstrong数定义
Armstrong数的定义是每个位上的数字的位数次方之和等于原数,比如1634是4位数,需要计算每个位的4次方之和。原代码固定用pow(b,3),仅能识别3位Armstrong数,且通用性极差。浮点数函数
pow的精度问题pow是浮点数运算函数,计算整数幂时可能出现精度误差(比如pow(10,1)可能返回9.999999999),强制转int后会导致后续的取位计算错误。
修正后的代码
#include <stdio.h> // 计算数字的位数(纯整数运算,无精度问题) int digit_count(int n) { if (n == 0) return 1; int count = 0; while (n != 0) { n /= 10; count++; } return count; } // 整数幂运算(替代pow,避免浮点数误差) int int_power(int base, int exp) { int result = 1; for (int i = 0; i < exp; i++) { result *= base; } return result; } // 判断并输出Armstrong数 void check_armstrong(int n) { int original = n; int sum = 0; int digits = digit_count(n); while (n != 0) { int digit = n % 10; sum += int_power(digit, digits); n /= 10; } if (sum == original) { printf("%d is an armstrong number.\n", original); } } int main() { int a, b; printf("Please input the left hand limit of range : \n"); scanf("%d", &a); printf("Please input the right hand limit of range : \n"); scanf("%d", &b); // 处理左边界大于右边界的情况 if (a > b) { int temp = a; a = b; b = temp; } for (int i = a; i <= b; i++) { check_armstrong(i); } check_armstrong(153); return 0; }
修正说明
digit_count函数:通过循环除以10计数,彻底避免浮点数带来的精度问题,准确计算数字位数。int_power函数:用整数循环实现幂运算,完全替代pow函数,消除浮点数误差。check_armstrong函数:初始化sum为0,用整数运算提取每一位数字,计算对应位数的幂之和,最后与原数比较。main函数:增加区间边界交换逻辑,避免用户输入左边界大于右边界时程序无有效输出。
内容的提问来源于stack exchange,提问作者goel_tanmay_13
相关产品推荐
相关产品推荐

