C语言 “水仙花数”(包懂)

请看题目:

打印水仙花数

题目内容:

求出0~100000之间的所有水仙花数并输出。

提示: 

“水仙花数”是指一个n位数,其各位数字的n次方之和确好等于该数本身,如:153=1^3+5^3+3^3,则153是一个“水仙花数”。


前言:

诸位应该注意到了,这里的水仙花数加了引号,其实水仙花数是自幂数的一种,三位自幂数叫做水仙花数。当然还有其他自幂数啦,一到十位自幂数的美名都在这里:

一位自幂数:独身数

两位自幂数:没有

三位自幂数:水仙花数

四位自幂数:四叶玫瑰数

五位自幂数:五角星数

六位自幂数:六合数

七位自幂数:北斗七星数

八位自幂数:八仙数

九位自幂数:九九重阳数

十位自幂数:十全十美数

好啦,不啰嗦,开始解题!@Claffic


大体思路:

要求0~100000之间的自幂数,当然先生成0~100000之间的整数 i 。然后根据自幂数的特点进行判断。

要做的就是

1.计算出 i 是 n 位数;

2.剥离 i 的每一位,各求其 n 次方,相加,判断是否与 i 相等。


解题: 

 1.计算出 i 是 n 位数

以153为例,这是个三位数,3 是怎么来的呢?

153/10 = 15     15/10 = 1    1/10 = 0;(整形之间的除法只取商的整数部分)

 直到 0 ,进行了三次;

按照这个思路写出代码:

int main()
{
	int i = 0;
	for (i = 0; i <= 1000000; i++)
	{
		//1.计算出 i 是 n 位数
		int n = 1;
		int tmp = i;//下面的循环会篡改i的值,此处把i放到tmp中进行循环
		while (tmp > 9)//两位数进入循环,放过一位数(一位数都属自幂数)
		{
			tmp /= 10;
			n++;//计数器
		}
}

 2.剥离 i 的每一位,各求其 n 次方,相加,判断是否与 i 相等

%10 取出个位,/10去掉个位  照此循环直到0即可;

求 i 每一位的 n 次方,可以用pow()函数;

        tmp = i;//原理同上
		int sum = 0;
		while (tmp)
		{
			sum += pow(tmp % 10, n);//计算 i 每一位的 n 次方并求和
			tmp /= 10;
		}
		if (sum == i)
		{
			printf("%d ", i);
		}

 结果展示:

#include<stdio.h>
#include <math.h>//包含pow()函数
int main()
{
	int i = 0;
	for (i = 0; i <= 1000000; i++)
	{
		//1. 计算出i是几位数 - n
		int n = 1;
		int tmp = i;
		while (tmp > 9)//153
		{
			tmp /= 10;
			n++;//1 2 3
		}

		//2.剥离 i 的每一位,各求其 n 次方,相加,判断是否与 i 相等
		tmp = i;
		int sum = 0;
		while (tmp)
		{
			sum += pow(tmp % 10, n);
			tmp /= 10;
		}
		if (sum == i)
		{
			printf("%d ", i);
		}
	}

	return 0;
}


你学会了嘛?快动手写写吧。

猜你喜欢

转载自blog.csdn.net/Claffic/article/details/128023453