PTA 程序设计考试复习——水仙花数

1-6 水仙花数

分数 10

作者 徐镜春

单位 浙江大学

水仙花数是指一个N位正整数(N≥3),它的每个位上的数字的N次幂之和等于它本身。例如:153=13+53+33。 本题要求编写程序,计算所有N位水仙花数。

输入格式:

输入在一行中给出一个正整数N(3≤N≤7)。

输出格式:

按递增顺序输出所有N位水仙花数,每个数字占一行。

输入样例:

1
3

输出样例:

1
2
3
4
153
370
371
407

答案

假如N为3

  • 要先预计算0-9的N次方,避免重复计算,提高效率,到时候直接加数组里面的次方后的数
  • 遍历每个数(100-999)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <iostream>
#include <cmath>
using namespace std;

int main() {
int N;
cin >> N;

// 计算N位数的范围:从10^(N-1)到10^N - 1
long long start = pow(10, N - 1);
long long end = pow(10, N) - 1;

// 预计算0-9的N次方,避免重复计算,提高效率
int power[10];
for (int i = 0; i < 10; ++i) {
power[i] = pow(i, N);
}

// 遍历所有N位数,检查是否为水仙花数
for (long long num = start; num <= end; ++num) {
long long temp = num;
long long sum = 0;

// 计算每位数字的N次方之和
while (temp > 0) {
int digit = temp % 10; // 取最后一位数字
sum += power[digit]; // 累加该数字的N次方
temp /= 10; // 移除最后一位数字
}

// 检查是否为水仙花数
if (sum == num) {
cout << num << endl;
}
}

return 0;
}