判断0~99999之间的所有“水仙花数”并输出

在数论中,水仙花数(Narcissistic number)也称为自恋数、自幂数、阿姆斯壮数或阿姆斯特朗数(Armstrong number),是指一n位数,其各位数字的n次方和等于该数。
比如:
153 = 1^3 + 5^3 +3^3
407 = 4^3 + 0^3 + 7^3
先看一个简单的程序,假如现在我们只想知道100-999之间的水仙花数,这个问题其实就很好解决了,我们遍历100 - 999之间的所有数,把每一个数字的个位,十位,百位拿出来,再求三次方和,如果还等于原来的数.就是水仙花数,程序如下

int main(){
int n;
int a, b, c;
int sum;
for ( n = 100; n < 1000; ++n){
	a = n / 100;
	b = n / 10 % 10;
	c = n % 10;
	sum = a * a * a + b * b * b+ c * c * c;
	if (n == sum){
		printf("%d ",n);
	}
}
system("pause");
return 0;
}

此时再回到原来的问题上,如果是0-99999之间呢,此时如果还用之前的方法,显然有些困难,因为我们不知道数字的位数,也不知道各位数字是多少!就无法求次方和.
此时我们所用思路如下

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
//判断0-99999之间的阿姆斯特朗数
int main(){
	int n;
	int a[10] = { 0 };
	int i;
	int sum = 0;
	int count = 0;
	//由于不确定数的位数,所以找一个数组将每一位存起来,并且用count记下数字的位数
	for (n = 0; n < 100000; ++n){	//遍历0-99999之间所有数字
		for (i = n; i; i /= 10){
			a[count] = i % 10;	//将数字的每一位保存在数组当中
			++count;	//确定数字的位数
		}
		for (i = 0; i < count; ++i){
			sum += pow(a[i],count);	//将数组中所存的数字的每一位进行对应的count次方并求和
		}
		if (n == sum){
			printf("%d \n",n);	
		}
		count = sum = 0;	//强制将count与sum归0
	}
	system("pause");
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_44781107/article/details/89643659