C语言实现判断自幂数代码(不止水仙花哦)

我们要判断自幂数,那首先我们需要搞清楚什么是自幂数:(前面是逻辑分析和代码讲解,最后有完整的代码)

假设有一个数是m,m是一个n位数,如果m的每一位的n次方之和等于m,那m就是自幂数,举个例子吧:

153是一个自幂数

它一共有3位

153=1^3+5^3+3^3

这就是所谓的自幂数。

不过不同位数的自幂数的名字也不一样,比如:

一位自幂数:独身数     两位自幂数:没有

三位自幂数:水仙花数     四位自幂数:四叶玫瑰数

五位自幂数:五角星数      六位自幂数:六合数

七位自幂数:北斗七星数     八位自幂数:八仙数

九位自幂数:九九重阳数     十位自幂数:十全十美数

这些名字真的不要太炫酷哈。

如果我们要求0--100000之间的自幂数,应该怎么做呢?

第一步,我们需要产生0--100000之间的数字,这可以由for循环来实现

e0b844804a704f00bfd4e80a9ba65291.png

第二步:我们需要判断i是不是自幂数,这又需要我们分这么几步来做:

2.1首先我们得知道它是几位数,然后才能判断看它的每一位的次方之和是不是等于它自己,如何才能知道它的位数呢,举个例子吧:

假设现在我们要计算m的位数,m=123,

123/10->12,除10后我们去掉了一位,当除10后商不等于0的时候说明我们拿到了一位(3),假设此时n是位数的话,n就加上1,n=1。

12/10->1,除10后我们又去掉了一位,商还是不等于0,说明我们又拿到了一位(2),n加1,n=2。

1/10=0,此时商等于0,如果商等于0,那n就不能加1了,但是1不是也算一位吗?这就是需要我们考虑的一个问题了。

其实任何数字,它至少都是一位数,所以这里代表位数的n应该至少从1开始,我们就令n的初值为1即可。

我们可以再来捋一遍逻辑:

 123/10->12,除10后我们去掉了一位,当除10后商不等于0的时候说明我们拿到了一位(3),假设此时n是位数的话,n就加上1,n的初值为1,加1后,n=2。

12/10->1,除10后我们又去掉了一位,商还是不等于0,说明我们又拿到了一位(2),n加1,n=3。

1/10=0,此时商等于0,如果商等于0,那n就不加1了。

那么到此结束,m=123,位数n=3,结果正确!

代码如下:

9e11dceb8ea24e249a16d53e8953f688.png

如果在循环内部改变循环变量,不但会影响后面的值,还会影响判断,所以为了避免在循环内部改变循环变量的值,我们可以创建一个临时变量tmp,把i的值赋给tmp,然后我们使用tmp就可以了。

在这个while循环里如果tmp不等于0,那n就会加加,等到tmp等于0了,循环就会自行停止。

第三步:求每一位的n次方之和

求每一位的n次方之和,那我们首先要得到它的每一位,还是给大家举例说明吧:

假设我们要得到123的每一位,应该怎么做呢,首先每次要得到它的最后一位,然后我们用完后需要去掉这一位,再接着得到它的下一位,做法如下:

123%10->3,这里我们得到了它的最后一位3,

123/10->12,相当于去掉了最后一位3。

12%10->2,这里得到了它的最后一位2,

12/10->1,相当于去掉了最后一位2。

1%10->1,这里得到了它的最后一位1,

1/10->0,去掉了最后一位。

代码如下:

048ce3ab51b44ab5a3781d3d94fe7f61.png

这里为了避免改动i的值,还是将i赋给tmp,使用tmp即可。

tmp%10得到它的最后一位,

pow这个函数可以帮我们计算它的n次方之和 ,记得引它的头文件#include<math.h>,

每次计算完之后我们需要将它的值存起来,所以这里创建了一个变量sum,最后tmp/10去掉已经计算过的这一位。循环条件在tmp的值为0时会自行停止。

第四步:判断

如果我们算出的sum跟i相等,那它就是我们所谓的自幂数,我们就将它打印出来,代码如下:

8a08e68ef4b24d77900863024ca21251.png

当我们掌握了这背后的逻辑,就可以轻松拿下这一类的题目了。

最后是整体的代码:

debb27b475984292addbcf1fafd3a76a.png

本次的分享到此结束,希望能够对你有帮助哦! 

  • 27
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值