输出0~999999之间的水仙花数

水仙花数,就是一个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类型,若没有进行强制类型转化,程序运行会报一个警告,此处凭个人意愿。
 

猜你喜欢

转载自blog.csdn.net/Watery________1314/article/details/82861234
今日推荐