暴力求解--完数个数(等于本身之外的因子之和)

找出10000以内的自然数中的所有完数,并统计找到的完数个数。

#include<stdio.h>
int main()
{
	//找到10000以内所有的完数(等于恰好等于它本身之外的因子之和),并统计完数个数。
	int n,i,s,count=0;
	printf("找到的所有完数:\n"); 
	for(n=1;n<10000;n++)
	{
		s=0;
		for(i=1;i<n;i++)
		{
			if(n%i==0)
			{
				s+=i;		
			}
		}
		if(s==n)
			{
				printf("%d ",n);
				count++;
			}
	}
	printf("完数个数为%d.\n",count); 
	return 0;
}

        对10000以内的每一个数进行取模运算,判断i是否为这个数的因子,如果是这个数的因子,那么将这个因子加入到s中,最后如果s等于这个数的话,则这个数为完数!

        对这个程序进行优化,首先在求因子的基础上,因子是成对出现的,在小于或等于\sqrt{n}出现一个因子,则在大于\sqrt{n}也必然出现一个对应的因子。注意:如果n=m^2,则因子不会成对出现。例如n=36,因子有1,2,3,4,6,9,12,18,36,因子6只出现一次。

由于s+=i+n/i;

所以在程序中如果n=m^2,那么 i 和 n/i 会相等,即因子重复一次,需要将这个因子减去一次。

#include<stdio.h>
#include<math.h> 
int main()
{
	int n,i,s,m,count=0;
	printf("找到的完数有:\n");
	for(n=2;n<10000;n++)
	{
		s=1;
		m=sqrt(n);
		for(i=2;i<=m;i++)
		{
			if(n%i==0)
			{
				s+=i+n/i;	
			}
		}
		if(n==m*m)
		{
			s-=m;
		}
		if(s==n)
		{
			printf("%d, ",n);
			count++;
		}
	} 
	
	printf("\n完数个数为%d\n",count);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_55848732/article/details/131999819
今日推荐