폭력적인 해결책 - 완전한 숫자(자신을 제외한 요소의 합과 동일)

10,000 이내의 자연수 중에서 완전수를 모두 찾고, 찾은 완전수의 개수를 세어보세요.

#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=36이고 요인은 1,2,3,4,6,9,12,18,36이고 요인 6은 한 번만 나타납니다. 참고: 해당 요소도 있어야 합니다. n=m^2

유우 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