阿姆斯特朗数是指一个n位正整数,其各位数字的n次方之和等于它本身;例如153是3位数,1³+5³+3³=153,9474是4位数,9⁴+4⁴+7⁴+4⁴=9474,判定时指数必须为实际位数而非固定值。

什么是阿姆斯特朗数?先看判定逻辑
阿姆斯特朗数(Armstrong number),也叫自恋数、水仙花数,是指一个 n 位正整数,其各位数字的 n 次方之和等于它本身。比如 153 是 3 位数,而 1^3 + 5^3 + 3^3 == 153,所以它是阿姆斯特朗数。
关键点在于:指数不是固定值(如总是 3),而是该数的位数。这点常被误写成“每位立方和”,导致对 9474(4 位)等数判断失败。
用 std::to_string 获取位数最稳妥
C++ 没有内置“求整数位数”函数,但把整数转成字符串再取 .length() 是最直观、不易出错的方式:
- 避免负数问题(阿姆斯特朗数定义为正整数,直接拒绝
n <= 0) - 避免除 10 循环时漏掉
0或边界错误(如1000有 4 位,但循环可能只跑 3 次) - 支持
int范围内所有正整数(to_string对INT_MAX也安全)
int n = 9474; if (n <= 0) return false; std::string s = std::to_string(n); int len = s.length(); // len == 4
幂运算别用 pow,手写整数幂更准
std::pow 返回 double,对较大底数(如 9^5)会产生浮点误差,导致比较失败:
立即学习“C++免费学习笔记(深入)”;
-
pow(9, 5)可能返回59048.999999,强制转int后变成59048,错失正确结果 - 整数幂只需简单 for 循环,无精度损失,且编译器容易优化
int ipow(int base, int exp) {
int res = 1;
while (exp-- > 0) res *= base;
return res;
}
计算每位数字的 len 次方和时,推荐这样写:
- 用
s[i]取字符,减'0'得数字值 - 累加时用
long long防溢出(如999999999的 9 次方和远超int)
完整可运行判断函数bool isArmstrong(int n) {
if (n <= 0) return false;
std::string s = std::to_string(n);
int len = s.length();
long long sum = 0;
for (char c : s) {
int digit = c - '0';
int p = 1;
for (int i = 0; i < len; ++i) p *= digit; // 整数幂
sum += p;
if (sum > n) break; // 提前退出,防溢出或加速
}
return sum == n;
}
注意两个易忽略点:
-
sum必须是long long,否则像9474(9^4 + 4^4 + 7^4 + 4^4 = 6561 + 256 + 2401 + 256 = 9474)在累加中途就可能溢出int - 提前判断
sum > n不仅省时间,还能避免sum溢出long long(虽罕见,但对 10 位以上数存在风险)


















