首先我们要先知道一个概念,什么叫水仙花数:
“水仙花数”是指一个n位数,其各位数字的n次方之和正好等于该数本身,如:153=1³+5 ³+3³,则153是一个“水仙花数”。
解题思路:
1.产生0~100000之间的数
利用for循环实现
for(int i=0;i<=100000;i++)
2.计算出这个数是几位数(方便后面拆解)
利用while循环实现
int n=0;
while(a)//a是要判断的几位数的数
{
a/=10;//a每次/10就去掉一位数,下面n++一次,知道a=0循环结束
n++;//计算a是几位数
}
3.计算每一位数的乘积相加(如:153=1³+5 ³+3 ³,有n位数,这个数字每一位的数要求出他的n次方然后相加)
拆解每一位,%10就可以拆解最后一位,得到它
然后/10就可以去掉最后一位,依此循环
int sum=0;
while(a)
{
int b=a%10;//把a数的最后一位放在b里面
int c=pow(b,n);//pow是一个库函数,需要相应的头文件,<math.h>
//pow的作用是求b的n次方
//n是第二步中,求出来的几位数
//然后把求出来的数放在c里
sum+=c;//把每一次求出来的数相加
a/=10;//a得最后一位之后在去掉最后一位
//例如,a原来是1234,%10得到4,/10使得1234变成123,再去循环,%10得到3,依次类推
}
4.判断是否和本身数字相同
if实现
if(sum==a)
printf("%d",a);
全部代码实现:
#include <stdio.h>
#include <math.h>
int main()
{
for (int i = 0;i <= 100000;i++)
{
int a = i;//把i赋值给a用来while判断i是几位数
int n = 0;
while (a)
{
a /= 10;
n++;
}
a = i;//把i赋值给a用来得到i得每一位数
int sum = 0;
while (a)
{
int b = a % 10;
int c = pow(b, n);
a /= 10;
sum += c;
}
if (sum == i)//最后相加得和等于i就是水仙花数
{
printf("%d ", i);
}
}
return 0;
}
运行结果如下