阿姆斯特朗数是n位非负整数,其各位数字的n次幂之和等于自身;C++中宜用std::to_string获取位数与各位数字,手写整数幂函数(避免std::pow浮点误差),用long long防溢出,并单独处理0及1–9等边界情况。

什么是阿姆斯特朗数,C++里怎么快速验证
阿姆斯特朗数(Armstrong number),也叫自恋数、水仙花数,是指一个 n 位数,其各位数字的 n 次幂之和等于它本身。比如 153 是 3 位数,1^3 + 5^3 + 3^3 = 1 + 125 + 27 = 153,所以它是阿姆斯特朗数。
注意:它和“阶乘和数”无关——阶乘和数(如 145 = 1! + 4! + 5!)是另一类数,标题里“阶乘和数”属于常见误解,实际判断逻辑完全不同。
用 std::to_string 提取位数和各位数字最稳妥
手动取模求位数容易漏掉 0 或负数边界,而 C++ 中整数转字符串可直接拿到长度和每个字符。这是最直观、少出错的方式:
- 先用
std::to_string(num)得到字符串,.length()就是位数n - 遍历字符串每个字符
c,用c - '0'转成数字,再用std::pow或手写整数幂(更安全)计算digit^n - 累加时用
long long防止中间结果溢出(例如999999999的 9 次方远超int)
示例关键片段:
int n = s.length();
long long sum = 0;
for (char c : s) {
int digit = c - '0';
sum += static_cast<long long>(std::pow(digit, n)); // 注意:std::pow 返回 double,有精度风险
}
⚠️ 更推荐手写整数幂函数避免浮点误差,尤其对大 digit 和大 n。
立即学习“C++免费学习笔记(深入)”;
std::pow 在整数幂场景下容易出错
std::pow 是为浮点数设计的,对整数输入可能因舍入产生 ±1 误差(比如 pow(5, 3) 返回 124.999999,取整后变 124)。这不是 bug,而是 IEEE 754 浮点表示限制。
- 对小指数(n ≤ 10)且 digit ≤ 9,可用
static_cast<int>(std::pow(digit, n) + 0.5)</int>补偿,但不通用 - 更可靠的是写个循环幂函数:
long long ipow(int base, int exp),用long long累乘,每次检查是否溢出(或直接限定输入范围) - 也可以用
<cmath>的std::llround(std::pow(...)),但依然依赖浮点精度,不如整数运算干净
负数、0、1 的边界要单独处理
C++ 中负数转字符串会带 '-',直接用 std::to_string(-153) 得到 "-153",长度是 4,显然不符合定义。阿姆斯特朗数默认定义在**非负整数**范围内。
-
0是 1 位数,0^1 = 0,所以0是阿姆斯特朗数 -
1到9都是 1 位数,满足d^1 = d,全部算阿姆斯特朗数 - 函数开头建议加判断:
if (num
别指望库函数自动处理这些语义规则——数学定义不会替你做输入校验。
真正麻烦的不是算法逻辑,而是幂运算的整数精度、大数溢出、以及把“字符串长度”等同于“位数”时对负号的误判。这几个点卡住,比写循环还耗时间。


















