自幂数
一个n位数的每一位数的n次方之和等于它本身的话就称之为自幂数
水仙花数
“水仙花数”是指一个3位数,其各位数字的3次方之和刚好等于该数本身,
如:153=1^3+5 ^3 + 3 ^3,则153是一个“水仙花数"。
注:水仙花数只是自幂数的一种,严格来说3位数的3次幂数才称为水仙花数。
求自幂数
求1 - 100000之间的所有自幂数
既然水仙花数是自幂数的一种,那么能求出自幂数自然能求出水仙花数。
所以就写一段通用代码。
int i;
for(i = 0;i <= 100000;n++)//判断i是否为自幂数
求解思路
判断 i 是否为自幂数(水仙花数)
1、计算 i 的位数,知道 i 是n位数
int n = 1;//先设次方为1,任何1位数至少是一次方
假设 i = 123,让 i 一直除10得到商,然后n自增,直到商 = 0的时候说明已经算到了最后
//123/10 = 12 n++;,12/10 = 1 n++;,1 / 10 = 0;此时n为3。
for(i = 0;i <= 100000;i++)//判断n是否为自幂数
{
int n = 1,t = i,sum = 0;
//1.计算i的位数—— n位数
while(t /= 10)//如果用i来/= 10的话,会改变i的值,所以用t代替i
{
n++ ;
}
2、计算 i 的每一位的 n 次方之和,假设和为sum。
//2.计算i的每一位的n次方之和sum
t = i;
while(t)//t不为0的话说明i 是多位数
{
sum += pow(t % 10,n);//t % 10得到最低位,然后乘上n次方
t /= 10;//t % 10之后已经得到1位了,/10把这个数去掉
}
3、比较 i 是否等于sum。
//3.比较i == sum
if(i == sum)
{
printf("%d ",i);
}
完整代码
#include <stdio.h>
#include <math.h>
int main()
{
int i;
//判断i是否为自幂数
for(i = 0;i <= 100000;i++)
{
int n = 1,t = i,sum = 0;
//1.计算i的位数—— n位数
while(t /= 10)//若果用i来/= 10的话每次i++之后一进来循环就把改成0,会出问题,所以用t代替i
{
n++ ;
}
//2.计算i的每一位的n次方之和sum
t = i;
while(t)//t不为0的话说明i 是多两位数
{
sum += pow(t % 10,n);//t % 10得到最低位,然后乘上n次方
t /= 10;//t % 10之后已经得到1位了,/10把这个数去掉
}
//3.比较i == sum
if(i == sum)
{
printf("%d ",i);
}
}
putchar('\n');
return 0;
}