题解
寻找水仙花数
1 条题解
-
0
P4702 寻找水仙花数(入门)
解题思路
水仙花数是一个三位数,它等于自己每一位数字的立方(三次方)之和。比如 153:1×1×1 + 5×5×5 + 3×3×3 = 1 + 125 + 27 = 153,所以 153 是水仙花数。下面分四步实现。
**第一步,确定范围。**因为我们只找三位数,范围就是 100 到 999,一个都不多,一个都不少。
**第二步,拆数。**用除法和取模拆出百位、十位、个位:hundreds = num/100,tens = num/10%10,ones = num%10。比如 num=370,百位=3,十位=7,个位=0。
**第三步,算立方和。**sum = hundreds³ + tens³ + ones³,也就是三个数分别乘自己两次再相加。
**第四步,判断并输出。**如果 sum 等于 num,就说明它是水仙花数,输出它。
再举个例子:num=407,百位=4,十位=0,个位=7,4³+0³+7³=64+0+343=407,也是水仙花数。注意十位是 0,0 的立方还是 0,加上它不影响结果,但拆位的时候不能漏掉这一位。
输出要求一行输出所有的水仙花数,中间用空格隔开。要注意空格的处理:第一个数前面不能有空格,后面的每个数前面要加一个空格。我用一个变量 first 记录是不是第一个数,只在不是第一个数时先输出一个空格,这样输出就不会有多余的空格了。
按从小到大枚举,答案依次是 153、370、371、407。
边界情况:最小的三位数 100 和最大的 999 都要检查到;个位可能是 0,0 的立方还是 0,不影响判断。
参考代码
// 水仙花数:三位整数各位数字的立方和等于它本身 #include <iostream> using namespace std; int main() { bool first = true; // 控制空格输出 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) { // 满足水仙花数的条件 if (!first) cout << " "; cout << num; first = false; } } cout << endl; return 0; }复杂度分析
只枚举 100 到 999,共 900 个数,每个数做固定几次乘法和加法,所以时间复杂度 O(900),也就是常数级别,空间 O(1),非常快。
- 1