

题目要求如下:
则称 ( ABC ) 为水仙花数。
例如:三位数 153 ,其三位系数分别是:
则 153 是水仙花数。
输入:
输出:
示例输出:
153
370
371
407我的做法如下:
#include <iostream>
using namespace std;
int main()
{
for (int i = 100; i <= 999; i++) // 遍历所有三位数
{
int m = i; // 存储当前数字
int count = 0; // 积累各位系数的立方和
while (m)
{
int j = m % 10; // 取位:下一个位系数
count += j * j * j; // 计算立方并积累
m /= 10; // 清除最低位
}
if (count == i) // 检查积累立方和是否等于原数字
cout << i << endl; // 输出
}
return 0;
}
for 循环遍历 [100, 999] 范围内的所有数字,以判断每个数字是否是水仙花数。m 存储当前数字,无需直接操作原数。count 用于积累各位系数立方和。while 循环: m % 10 获得最低位;j * j * j 直接计算立方值;m /= 10,将数字左移一位;循环至数字为 0 为止。老师的代码如下:
#include <iostream>
#include <cmath> // 引入函数 pow
using namespace std;
int main()
{
for (int i = 100; i <= 999; i++) // 遍历所有三位数
{
int tmp = i; // 临时处理数字
int ret = 0; // 积累各位系数立方和
while (tmp)
{
ret += pow(tmp % 10, 3); // 取位和立方,使用pow函数
tmp /= 10; // 清除最低位
}
if (ret == i) // 检查积累立方和是否等于原数
cout << i << endl; // 输出
}
return 0;
}
pow 函数计算立方:
老师的做法并没有用直接乘法计算立方,而是使用了标准库中的 pow 函数。这样做的好处是:在基础程序教学中,比较直观,学生能学习标准函数的应用;同时使用 pow 计算任意次方,优质显而易见。
tmp 分解,保留原数,从维护和计算的规范性方面,有较高的规范性和应用性。
pow 函数,明确表达了“次方”的概念,更便于基础教学和理解。pow(tmp % 10, n) ,适配与任意次方计算,更具通用性。pow 函数导致调用源库,效率上不如直接乘法。在计算量不大时,注意不显著;但如若展开到更大的数据量,远不如乘法计算的效率高。方式 | 核心思想 | 优势 | 不足 |
|---|---|---|---|
我的做法 | 通过三次乘法直接计算立方 | 性能高,逻辑简洁,极对化 | 相对基础学生,学习成本较高 |
老师做法 | 使用 pow 函数计算立方 | 可读性好,通用性强 | 性能不如直接乘法,有调用源库的增加费用 |
在经典做法上,如下作举可能更加高效和实用:
使用数学运算分解数字的各位,无需循环:
#include <iostream>
using namespace std;
int main()
{
for (int i = 100; i <= 999; i++)
{
int a = i / 100; // 百位
int b = (i / 10) % 10; // 十位
int c = i % 10; // 个位
if (i == a * a * a + b * b * b + c * c * c)
cout << i << endl;
}
return 0;
}

这种做法可以直接获取各位,避免伴随调用和循环,效率更高。
通过使用函数展开计算任意位数的水仙花数:
#include <iostream>
#include <cmath>
using namespace std;
// 检查水仙花数
bool isArmstrong(int n)
{
int sum = 0, tmp = n;
int digits = log10(n) + 1; // 位数
while (tmp)
{
sum += pow(tmp % 10, digits); // 次方积累
tmp /= 10;
}
return sum == n;
}
int main()
{
for (int i = 100; i <= 999; i++)
{
if (isArmstrong(i))
cout << i << endl;
}
return 0;
}

通过对我和老师做法的分析,我们能看到:
在实际经验中,可根据场景和需求选择最适合的方案,例如教学中选择通过性更强的方案,而在效率优先的场景下,可选择性能更高的直接乘法。求真时,始终是计算积累的深层探索!