阿姆斯特朗数是n位正整数,其各位数字的n次方之和等于自身;不能直接用pow判断,因其返回double导致大数时浮点精度误差(如pow(9,7)≈4782968.999999),应手写整数幂函数ipow避免精度问题。

什么是阿姆斯特朗数,为什么不能直接用 pow 判断?
阿姆斯特朗数(也叫自恋数、水仙花数)是指一个 n 位正整数,其各位数字的 n 次方之和等于它本身。例如 153 是 3 位数,而 1^3 + 5^3 + 3^3 == 153,所以它是阿姆斯特朗数。
关键陷阱在于:pow 返回 double,浮点计算有精度误差。对大一点的数(比如 7 位以上),pow(9, 7) 可能算出 4782968.999999,取整后变成 4782968,结果错误。必须手写整数幂或用循环累乘。
如何安全地提取每一位并统计位数?
别转字符串——虽然简单,但不符合“纯数值计算”的常见考察意图,且可能被质疑效率或内存开销;更推荐用除法循环。注意:0 要单独处理(否则循环不进),负数直接返回 false。
- 用
abs(n)处理负数输入(阿姆斯特朗数定义为正整数,但函数常需健壮性) - 先复制原值用于后续各位求和,再用循环
n /= 10数位数并缓存各位数字到 vector 或直接累加 - 避免重复遍历:一次循环同时得到位数
len和各位数字列表,别先数位再重来一遍取位
整数幂怎么写才不出错?
自己写个 ipow(int base, int exp),用迭代而非递归,防止栈溢出,且完全规避浮点问题:
int ipow(int base, int exp) {
int res = 1;
while (exp-- > 0) res *= base;
return res;
}
注意边界:base 为 0 且 exp > 0 时返回 0;exp == 0 按数学定义应返回 1,但阿姆斯特朗数至少是 1 位数,实际调用时 exp >= 1,可省略特判。若传入 exp == 0,当前逻辑会返回 1(因为循环不执行),也算合理。
完整判断逻辑与易错点
核心就是:位数 len 算准、每位数字取准、幂运算用整数、求和不溢出(int 通常够用到 9 位以内;10 位数如 9^10 * 10 ≈ 3.4e9,接近 INT_MAX,建议用 long long 累加更稳妥)。
- 输入为 0?按定义不是阿姆斯特朗数(它不是正整数),但有些宽松定义接受 0;明确需求再决定是否加
if (n == 0) return false; - 用
long long sum = 0存累加和,防止int中间溢出导致误判 - 不要在循环里反复调用
log10或字符串转换——它们慢,且log10同样有浮点误差 - 测试用例至少覆盖:
0,1,153,9474,92727,54748,以及一个明显非阿姆斯特朗数如123
最常被忽略的是:没处理 int 溢出,以及盲目信任 pow。这两个点一错,整个函数在稍大输入下就不可靠。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











