1.什么是“水仙花数”?
水仙花数是指一个数字,它的每个数位上的数字的 n次幂之和等于它本身。(其中n为水仙花数的总位数)例如:1^3 + 5^3+ 3^3 = 153。
三位的水仙花数共有4个:153,370,371,407;
四位的四叶玫瑰数共有3个:1634,8208,9474;
五位的五角星数共有3个:54748,92727,93084;
六位的六合数只有1个:548834;
七位的北斗七星数共有4个:1741725,4210818,9800817,9926315;
八位的八仙数共有3个:24678050,24678051,88593477;
九位的九九重阳数共有4个: 146511208,472335975,534494836,912985153;
十位的自幂数只有1个:4679307774
2.代码原理分析:
底层逻辑:水仙花数的每一位数字的三次方之和等于它本身;那么我们需要提取出该数字的每一位,对其的三次方进行求和与水仙花数本身进行比较,判断可以得到其是否是水仙花数
1.首先判断是几位数:
int n=1;
while(temp/10)
{
n++;
temp=temp/10;
}
temp就为水仙花数,我们对其/10,每除一个10,即可去掉一位数字,所以进行累加即可得到其对应的数字个数;
那么为什么n从1开始累加,而不是0呢?
原因:temp/10当水仙花数是一位数时,在刚进入循环时temp/10就为0,那么就不会进入循环进行n的累加,所以初始化设置n为1,不进入循环即默认为1位数字;
2.提取数字,并进行累加:
temp=i;
int sum=0;
while(temp)
{
sum+=(int)pow(temp%10,n)//在此处调用math.h库函数
temp=temp/10;
}
对temp(水仙花数)进行取模运算,那么即可得到每一位数字;注意每次取模运算完成后,将temp/10,进行下一位数的提取;
调用库函数math.h,其中pow函数的结构为:double pow(double base,double exponent);其返回值为double类型的,而sum为整型变量,那么我们对pow的结果进行强制类型转换;
3.进行判断比较;
if(sum==i)
{
printf("%d ",i);
}
那么要是判断某个范围内的水仙花数,我们需要对其一一进行上述判断,所以我们引入for循环,作为整个代码的大框架;
for(i=0;i<10000;i++)
{
;
}
3.完整代码示例:
#include<stdio.h>
#include<math.h>
int main()
{
int i = 0;
for (i = 0; i <=100000; i++)
{
int n = 1;//每次循环都对应着一个新的需要进行判断的值,那么每次的n值都应该重新进行累加
//如果不放在内部的话,n的值在初始的时候就不再是1,而是已经进行累加过的值,不符合代码要求
int temp = i;//用来存储i的值,防止i被改变;
//判断该数是几位数!
while (temp / 10)//为什么n的初始值设为1;因为当为1位数时,temp/10就为0,不进入while循环,n的值也不会进行累加,
//所以初始值设为1,1位数才可有后面的n次方;
{
n++;//
temp = temp / 10;
}
//进行累加;
temp = i;//重新将i赋给temp;
int sum = 0;
while (temp)
{
sum+=(int)pow(temp % 10, n);//因为pow的返回值为double类型的,所以需要将其强制转换成int型防止报错警告
//调用pow(math.h)库函数,pow(a,b),计算a的b次方;
temp = temp / 10;//去掉最后一个数字
}
if (sum == i)
{
printf("%d\n", i);
}
}
return 0;
}