求出0~999之间的水仙花

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

“水仙花数”是指一个三位数,其各位数字的立方和确好等于该数本身,如;153=1+5+3?,则153是一个“水仙花数”。 


/* 
首先我们先了解一下什么叫水仙花,在数论中,水仙花数(Narcissistic number)也称为自恋数、自幂数、阿姆斯壮数或阿姆斯特朗数(Armstrong number),是指一N位数,其各个数之N次方和等于该数。 
例如153、370、371及407就是三位数的水仙花数,其各个数之立方和等于该数: 
153 = 1^3 + 5^3 + 3^3。 
370 = 3^3 + 7^3 + 0^3。 
371 = 3^3 + 7^3 + 1^3。 
407 = 4^3 + 0^3 + 7^3。 

*/ 

要求一个水仙花,我们先要得到它的百位上的数字,怎么得到呢?我们只需要让这个数除以一百就得到了百位上的数字;

同理,用这个数先对一百取余得到一个两位数,再用得到的两位数除以10,我们便得到十位数的数字;

个位上的数字当然只需要对10取余就得到啦,以下就是具体的得到相应数字的计算公式

         //a=i/100;   //  153除以100得到1 
//b=(i%100)/10;  // 153对100取余得到53,53对10取余得到3

//c=i%10;

接下来我们就需要对这个数进行判断,将各个数字进行立方计算并相加,把相加的结果与这个数进行比较,如果是一样打的数,那么这个数就是水仙花。

if (i == sum && i != 0 && i !=1) //这里我们需要判断

#include<stdio.h>
	int main()
	{
	int i,sum;
	int a,b,c;
	for(i=0;i<999;i++)
	{	
	a=i/100;   //  153除以100得到1 
	b=(i%100)/10;  //	153对100取余得到53,53对10取余得到3
	c=i%10;
	sum = a*a*a+b*b*b+c*c*c;
	if (i == sum && i != 0 && i !=1)
	{
	printf("%d  ",i);
	}
	}
	return 0;
	}

其实,以上方法是大多数人的正常思考习惯,虽然按要求求出了0~999之间的水仙花,但是还是有局限性的,以下给出通用的简洁算法。

    int main()
    {
	int i = 0;
	for(i=1; i<=1000; i++)
	{
		//1. 获得i的位数
		//123
		int tmp = 0;
		int count = 1;
		int sum = 0;
        	tmp  = i;
		while(tmp>=10)
		{
			count++;
			tmp=tmp/10;
		}
		//2. 获得i的每一位,计算次方和
		tmp = i;
		while(tmp)
		{
			sum  = sum + pow(tmp%10, count);
			tmp = tmp/10;
		}
		//3. 判断是否为水仙花数
		if(sum == i)
		{
			printf("%d ", i);
		}
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_39478237/article/details/80114583