题目的主要信息:

  • 水仙花数是指一个三位数,其各位数字的立方和等于该数本身
  • 请输出所有的水仙花数,一行一个

具体做法:

首先水仙花数只会是三位数,因此我们遍历100999100 - 999,即所有的三位数,对每一个三位数检查是否是水仙花数。

检查的时候,我们用对10取余求得个位数字,让其除以10以后再对10取余求得10位数字,最后再除以10以后对10取余求得百位数字。三个数字各自的三次方求和与原数比较,如果相等则是水仙花数,输出该数。

alt

#include <iostream>
using namespace std;

bool isNarcissus(int num){
    int temp = num;
    int a = num % 10; //个位
    num /= 10;
    int b = num % 10; //十位
    num /= 10;
    int c = num % 10; //百位
    if(temp == a * a * a + b * b * b + c * c * c) //判断个位、十位、百位数各自三次方后相加是否等于该数
        return true;
    else
        return false;
}

int main() {
    for(int i = 100; i < 1000; i++){ //遍历所有的三位数
        if(isNarcissus(i)) //如果是水仙花数则输出
            cout << i << endl;
    }
	return 0;
}

复杂度分析:

  • 时间复杂度:O(1)O(1),循环从100100999999属于常数次,判断是否是水仙花数也是常数级
  • 空间复杂度:O(1)O(1),常数个变量