“水仙花数”是指一个n位数,其各位数字的n次方之和确好等于该数本身,如:153=1^3+5^3+3^3,则153是一个“水仙花数”。
思路:
- 求出这个数是几位数,如153是个三位数
- 得到组成这个数的每一个数字,如153中的1、5、3
- 将单个数字的n次方储存在数组中,如sum[1]=1^3,sum[2]=5^3,sum[3]=3^3
- 将数组所有元素相加,all=sum[1]+sum[2]+sum[3]
- 判断和与此数是否相等,相等则为水仙花数
#include<stdio.h>
int narcissus(int n) //判断是否为水仙花数
{
int num = 1; //n的位数
int count = 1;
int single = 0; //变量,储存n中的单个数字
int sum[7] = {}; //用于存放单个数字的n次方
int all = 0; //数组sum的全部值相加
int mun = num; //将num赋值给mun,这样修改mun就不会改变原来num的值
int m = n; //将n的值赋给m,这样修改m的的时候n就不会被改变
while ((n / count)>1) //判断n是几位数
{
count *= 10;
num++;
}
while (mun >= 0) //n为几位数,就循环几次,求出单个数字的num次方
{
single = m % 10;
sum[mun] = single;
for (int i=0; i <= num; i++)
{
sum[mun] *= single; //求出单个数字的num次方,并储存在sum数组中
}
m /= 10; //将n按位右移,如123->12
mun--;
}
for (int i = 0; i <= 6; i++)
{
all += sum[i]; //计算sum数组和
}
if (all == n)
{
return n; //如果是水仙花数,则返回n,不是则返回0
}
return 0;
}
int main()
{
int n = 0;
int i = 1;
while (i <= 100000) //从1到100000中的水仙花数
{
int ret;
ret = narcissus(i); //得到返回值
if (ret != 0) //返回值不为0则打印
{
printf("%d ", ret);
}
i++;
}
return 0;
}