7-2 水仙花数

发布时间 2023-11-02 13:24:17作者: 刘倩_网安2211

目录

题目

水仙花数是指一个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