top1编程
← 返回题目
题解

寻找水仙花数

1 条题解

  • 0
    @ 2026-8-6 1:50:12

    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