C++阿姆斯特朗数判断代码异常:非阿姆斯特朗数误判问题排查
阿姆斯特朗数判断程序错误排查与修复
错误分析
你的代码存在四个关键问题,导致逻辑失效:
- 原始输入值被破坏:在main函数计算数字位数的for循环中,直接修改了输入变量
n,循环结束后n的值变为0,后续调用ifarmstrong时传入的是0,必然导致错误判断。 - while循环逻辑错误:
ifarmstrong函数中,循环里直接将num赋值为num%10,没有移除已处理的个位数字,循环只会执行一次(甚至可能陷入死循环),无法遍历所有数位。 - pow函数的精度陷阱:
pow是浮点运算函数,计算整数次幂时可能出现精度误差(比如pow(5,3)可能返回124.9999999,强制转int后变成124),导致立方和计算错误。 - 拼写错误:输出字符串中的
armstorng应为armstrong。
修正后的代码
#include <iostream> using namespace std; // 自定义整数幂运算,避免浮点精度问题 int power(int base, int exp) { int result = 1; for (int i = 0; i < exp; i++) { result *= base; } return result; } bool ifarmstrong(int n, int p) { int sum = 0; int num = n; while (num > 0) { int digit = num % 10; // 提取个位数字 sum += power(digit, p); num = num / 10; // 移除已处理的个位数字 } return sum == n; } int main() { int n; cin >> n; int temp = n; // 保存原始输入值 int digit_count = 0; // 用temp计算位数,不修改原始n for (; temp > 0; digit_count++) { temp = temp / 10; } cout << digit_count << endl; if (ifarmstrong(n, digit_count)) { cout << "Yes it is armstrong" << endl; } else { cout << "No it is not" << endl; } return 0; }
关键修改说明
- 保存原始输入:新增
temp变量存储输入的n,用temp计算数字位数,保留n的原始值用于后续阿姆斯特朗数判断。 - 修复循环逻辑:在
ifarmstrong的while循环中,先提取个位数字digit,再将num除以10移除已处理的数位,确保能遍历所有数字。 - 替换pow函数:自定义
power函数实现整数次幂运算,完全避免浮点精度带来的计算误差。 - 修正拼写错误:将输出中的
armstorng改为正确的armstrong。
内容的提问来源于stack exchange,提问作者Pranay Malusare
相关产品推荐
相关产品推荐

