求出0~100000之间的所有“水仙花数”并输出。

少爷 公主们请看题,首先先来介绍一下什么是”水仙花数":

“水仙花数”是指一个n位数,其各位数字的n次方之和确好等于该数本身,如:153=1^3+5^3+3^3,则153是一个“水仙花数”。

那么由上可知,如何确定它是一个“水仙花数”,首先我们要确定它是一个几位数,然后把它的每一位分离出来,最后再来看看分离出来的每一位的n次方是否等于它本身。既然我们大概有了一个思路,接下来就开始逐步写。

我们写一个函数来判断它是不是水仙花数:

int isShui(int a) 
{

}

首先我们先判断它是一个几位数:

while (a != 0) 
{
    a /= 10;
    ++n;
}

接下来就是把它的每一位分离出来,假设为1234,那么1234%10=4分离出来4),然后再1234/10=123为下一次分离3出来),接着就是123的分离,如此的重复上述步骤。直到n/10=0,我们就结束循环,那么我们可以如此写道:

while (a != 0) 
{
    b = a % 10;
    result += pow(b, n);
    a /= 10;
}

但是我们写到这一步发现:上面我们在计算是几位数时,我们改变了a的值,而后面在分离时也要用到a,所以我们要保证a的值在此期间不能有所改变!所以此时我们可以借助另外一个数来等于a,使其保证不会被改变:

int isShui(int num) 
{
    int a, b;
    int n = 0;
    int result = 0;

    a = num;

    //计算是几位数
    while (a != 0) 
    {
        a /= 10;
        ++n;
    }

    a = num;

    while (a != 0) 
    {
        b = a % 10;
        result += pow(b, n);
        a /= 10;
    }
}

接下来就是根据其返回值来判断是不是水仙花数,假设我们规定1为其水仙花数,0则表示不是:

int isShui(int num) 
{
    int a, b;
    int n = 0;
    int result = 0;

    a = num;

    //计算是几位数
    while (a != 0) 
    {
        a /= 10;
        ++n;
    }

    a = num;

    while (a != 0) 
    {
        b = a % 10;
        result += pow(b, n);
        a /= 10;
    }
    if (num < 10)
        return 0;
    if (result == num)
        return 1;
    else
        return 0;
}

那么最后就是我们主函数了,主函数就很容易了,接下来我们就来看看整体的代码:

int isShui(int num) 
{
    int a, b;
    int n = 0;
    int result = 0;

    a = num;

    //计算是几位数
    while (a != 0) 
    {
        a /= 10;
        ++n;
    }
    a = num;
    while (a != 0) 
    {
        b = a % 10;
        result += pow(b, n);
        a /= 10;
    }
    if (num < 10)
        return 0;
    if (result == num)
        return 1;
    else
        return 0;
}
int main() 
{
    
    printf("水仙花数:\n");
    for (int i = 1; i < 100000; i++) 
    {
        if (isShui(i))
        {
            printf("%d\n", i);
        }
    }

    return 0;
}

看看运行效果:

 少爷 公主你学废了吗?😀😀😀

  • 40
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

并不会

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值