酷代码 AI
菜单
服务商

C++ 水仙花数查找:完整实现与常见陷阱规避指南

好的,这是一个经典的编程练习题。下面我将为你提供完整的C++解决方案,并详细解释代码的每一步。 ## 🌸 问题分析 **水仙花数**(Narcissistic number)也称为自恋数、自幂数。对于一个 `n` 位数,如果它的每个位上的数字的 `n` 次幂之和等于它本身,这个数就是水仙花数。 - 三位数的水仙花数范围:100 ~ 999 - 条件:`百位^3 + 十位^3 + 个位^3 == 该数本身` 例如: `153 = 1^3 + 5^3 + 3^3` ## 💻 C++ 代码实现 ```cpp #include <iostream> #include <cmath> // 可选,也可以用手工计算立方 using namespace std; int main() { // 遍历所有三位数 for (int num = 100; num <= 999; num++) { // 提取百位、十位、个位数字 int hundreds = num / 100; // 百位 int tens = (num / 10) % 10; // 十位 int ones = num % 10; // 个位 // 计算各位的立方和 int sum = hundreds * hundreds * hundreds + tens * tens * tens + ones * ones * ones; // 判断是否为水仙花数 if (sum == num) { cout << num << " "; } } cout << endl; // 输出换行,使格式整洁 return 0; } ``` ### ❓ 说明为什么不用 `pow()` 函数? `pow()` 返回 `double` 类型,存在精度问题: - 例如 `pow(3, 3)` 理论上返回 `27.0`,但在某些编译器上可能返回 `26.999999` - 强制转换为 `int` 时,会得到 `26`,导致错误判断 - 因此推荐直接用乘法 `n*n*n` 来计算立方 ## 🧠 关键概念解释 | 概念 | 说明 | |------|------| | **循环** | `for (int num = 100; num <= 999; num++)`:遍历所有三位数 | | **整数除法** | `num / 100` 得到百位(例如 `370/100=3`) | | **取模运算** | `num % 10` 得到个位(例如 `370%10=0`) | | **组合提取** | `(num / 10) % 10` 得到十位(例如 `(370/10)=37, 37%10=7`) | ## 🎯 输出结果 运行程序后,控制台将输出: ``` 153 370 371 407 ``` **3位水仙花数共有4个**:153、370、371、407。 ## 🔧 进阶与扩展建议 1. **改为函数封装** - 可以将判断逻辑写成函数 `bool isNarcissistic(int num)`,提高代码复用性 2. **扩展为任意位数** - 例如求4位的水仙花数(每位数的4次方和) 3. **优化性能** - 预先计算 0~9 的立方(或 n 次方)存入数组,避免重复计算 ## 📚 开发建议 1. **注重边界测试**:循环的起始和结束条件要准确(100~999) 2. **避免精度陷阱**:尽量使用整数运算替代浮点运算 3. **输出格式规范**:水仙花数之间使用**空格分隔**,最后一个数后面不要多余空格 4. **代码可读性**:变量命名要清晰(如 `hundreds, tens, ones` 比 `a, b, c` 更好) <br> <br> ######[AI写代码神器 | 881点数解答 | 2026-06-05 19:23:18]

相关提问
本站限时免费提问中
实用工具查看更多
Linux在线手册 [开发类]
Jquery在线手册 [开发类]
今日油价 [生活类]
图片互转base64 [开发类]
时间转换器 [开发类]