目录
目录题目
水仙花数是指一个N位正整数(N≥3),它的每个位上的数字的N次幂之和等于它本身。例如153=1^3+5^3+3^3
。
本题要求编写程序,计算所有N位水仙花数。
输入格式:
输入在一行中给出一个正整数N(3≤N≤7)。
输出格式:
按递增顺序输出所有N位水仙花数,每个数字占一行。
输入样例:
3
输出样例:
153
370
371
407
思路
伪代码
1.输入正整数位数n;
2.设i为最小n位数,max为最大n位数;
3.循环:i->max
3.1.令x=i,计算x每个位上数的n次幂之和s;
3.2.如果s==i,则i为完数
代码
第一次未通过所有测试点
#include<stdio.h>
#include<math.h>
int main()
{
int n, i, max, s = 0;
scanf_s("%d", &n);
i = pow(10, n - 1);
max = pow(10, n) - 1;
for (; i <= max; i++)
{
s = 0;
int x = i;
while (x)
{
s += pow(x % 10, n);
x /= 10;
}
if (s == i)
printf("%d\n", i);
}
return 0;
}
评测详情
分析原因
n太大时,n位数数量太多,循环太多次,运行超时。
因此要想办法减少循环或调用函数来减少运行时间。
第二次通过所有测试点
调用函数会比函数库快
#include<stdio.h>
int pow(int a, int n)
{
int s = 1;
for (; n > 0; n--)
{
s = s * a;
}
return s;
}
int main()
{
int n, i, max, s = 0;
scanf_s("%d", &n);
i = pow(10, n - 1);
max = pow(10, n) - 1;
for (; i <= max; i++)
{
s = 0;
int x = i;
while (x)
{
s += pow(x % 10, n);
x /= 10;
}
if (s == i)
printf("%d\n", i);
}
return 0;
}
测试详情
题后小知识
水仙花数只是自幂数的一种,严格来说3位数的3次幂数才称为水仙花数。
- 其他位数的自幂数名字
-
自冥数 名称 常见自冥数 一位 独身数 - 三位 水仙花数 153,370,371,407 四位 四叶玫瑰数 1634,8208,9474 五位 五角星数 54748,92727,93084 六位 六合数 548834 七位 北斗七星数 1741725,4210818,9800817,9926315 八位 八仙数 24678050,24678051,88593477 九位 九九重阳数 146511208,472335975,534494836,912985153 十位 十全十美数 4679307774