阿姆斯特朗数是n位正整数且各位数字的n次幂之和等于自身;C++中需先统计位数n,再用自实现int_pow逐位求幂累加,注意处理0、负数及溢出,避免pow精度误差。

什么是阿姆斯特朗数,C++里怎么快速验证
阿姆斯特朗数(也叫自恋数、水仙花数)是指一个 n 位正整数,其各位数字的 n 次幂之和等于它本身。比如 153 是 3 位数,而 1^3 + 5^3 + 3^3 == 153,所以它是阿姆斯特朗数。
在 C++ 中,判断的关键不是“数学推导”,而是:先算出位数 n,再逐位取幂求和,最后比对。注意别直接用 pow() 算整数幂——它返回 double,有精度误差,尤其对较大数字(如 7 位以上)可能误判。
如何安全提取每一位并计算 n 次幂
推荐用循环取余法拆解数字,同时统计位数;幂运算自己写整数版 int_pow(),避免 pow(int, int) 的隐式转换陷阱。
- 用
temp = abs(n)处理输入可能为负的情况(阿姆斯特朗数定义为正整数,但用户可能传负值,需提前拦截或取绝对值) - 用
while (temp) { digit = temp % 10; temp /= 10; ++n; }得到位数和各位数字 - 重跑一遍原数,对每个
digit调用自实现的int_pow(digit, n)(用循环累乘,不依赖) - 累加结果时注意溢出:
sum类型建议用long long,因为 9^10 已超int范围
常见错误:为什么 9474 判定失败?
典型现象是:输入 9474(4 位),程序返回 false。问题往往出在两个地方:
-
pow(9,4)返回6561.0000001或6560.9999999,转成int后变成6560或6561错误值 - 没重置临时变量,第一次统计位数后
temp变成 0,第二次循环直接跳过,导致sum为 0 - 忽略 0 和 1 的边界:它们是合法的阿姆斯特朗数(
0^1 == 0,1^1 == 1),但若代码中写了if (n == 0) return false;就会误杀
C++ 实现示例(可直接粘贴测试)
#include <iostream>
#include <cmath> // 仅用于 abs,非 pow
using namespace std;
int int_pow(int base, int exp) {
int res = 1;
while (exp--) res *= base;
return res;
}
bool isArmstrong(int num) {
if (num <p>真正容易被忽略的是:当输入为 <code>0</code> 时,第一个 <code>while (temp)</code> 不进循环,<code>n</code> 保持 0,后续 <code>int_pow(digit, 0)</code> 会错乱——所以必须单独处理 <code>num == 0</code> 这个 case。</p></cmath></iostream>
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











