水仙花数,就是一个n位数的每位数的n次方之和与这个数本身相等,谓之水仙花数。(在一些资料上提到的只有三位数是水仙花数,其他位数有其他的名字,此处不深究,就按照例子上的定义求解水仙花数)
例如153=1^3 + 5^3 + 3^3,再例如1634=1^4 + 6^4 + 3^4 + 4^4。
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int main()
{
int i = 0;
for (i = 0; i < 1000000; i++)
{
int count = 1;
int tmp = i;
int sum = 0;
//计算几位数
while (tmp / 10)
{
count++;
tmp /= 10;
}
//计算每位数的次方和
tmp = i;
while (tmp)
{
sum += (int)pow(tmp % 10, count);
tmp = tmp / 10;
}
//比较
if (i == sum)
printf("%d ", i);
}
system("pause");
return 0;
}
可以把程序分为三部分去写:
首先计算当前数为几位数 ,这里用tmp/10来实现,每除10就将个位除掉,直至为0,将位数统计下来;这里重点说明一下count一 开始为什么从1开始,因为判断条件是tmp/10,当tmp为1位数时,tmp/10 = 0;此时不执行count++,所以我们可以这样 认为: 不管是什么数,最少都会有一位。(此处若是还不能理解,请看最后重新给一个代码)
其次计算当前次数的各位数的次方和,具体不分析了,看代码;
最后再比较次数与它的各位数次方和是否相等,相等则是水仙花数,输出即可。
最后再给一个代码,运行结果一样,稍加改动
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int main()
{
int i = 0;
for (i = 0; i < 1000000; i++)
{
int count = 0;
int tmp = i;
int sum = 0;
//计算几位数
while (tmp )
{
count++;
tmp /= 10;
}
//计算每位数的次方和
tmp = i;
while (tmp)
{
sum += (int)pow(tmp % 10, count);
tmp = tmp / 10;
}
//比较
if (i == sum)
printf("%d ", i);
}
system("pause");
return 0;
}
有这么一句代码 sum += (int)pow(tmp % 10, count)
这里用到了强制类型转化,这里将等号右边的原本为double类型强制转化为int类型,若没有进行强制类型转化,程序运行会报一个警告,此处凭个人意愿。