我们要判断自幂数,那首先我们需要搞清楚什么是自幂数:(前面是逻辑分析和代码讲解,最后有完整的代码)
假设有一个数是m,m是一个n位数,如果m的每一位的n次方之和等于m,那m就是自幂数,举个例子吧:
153是一个自幂数
它一共有3位
153=1^3+5^3+3^3
这就是所谓的自幂数。
不过不同位数的自幂数的名字也不一样,比如:
一位自幂数:独身数 两位自幂数:没有
三位自幂数:水仙花数 四位自幂数:四叶玫瑰数
五位自幂数:五角星数 六位自幂数:六合数
七位自幂数:北斗七星数 八位自幂数:八仙数
九位自幂数:九九重阳数 十位自幂数:十全十美数
这些名字真的不要太炫酷哈。
如果我们要求0--100000之间的自幂数,应该怎么做呢?
第一步,我们需要产生0--100000之间的数字,这可以由for循环来实现
第二步:我们需要判断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,结果正确!
代码如下:
如果在循环内部改变循环变量,不但会影响后面的值,还会影响判断,所以为了避免在循环内部改变循环变量的值,我们可以创建一个临时变量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,去掉了最后一位。
代码如下:
这里为了避免改动i的值,还是将i赋给tmp,使用tmp即可。
tmp%10得到它的最后一位,
pow这个函数可以帮我们计算它的n次方之和 ,记得引它的头文件#include<math.h>,
每次计算完之后我们需要将它的值存起来,所以这里创建了一个变量sum,最后tmp/10去掉已经计算过的这一位。循环条件在tmp的值为0时会自行停止。
第四步:判断
如果我们算出的sum跟i相等,那它就是我们所谓的自幂数,我们就将它打印出来,代码如下:
当我们掌握了这背后的逻辑,就可以轻松拿下这一类的题目了。
最后是整体的代码:
本次的分享到此结束,希望能够对你有帮助哦!