1. 에라토스테네스의 체란

2. 에라토스테네스의 체란


에라토스테네스의 체를 이용한 문제는 프로젝트 오일러 사이트에 올라온 문제이기도 하며, 에라토스테네스의 체를 이용 안하고 풀었을 때와 이용 했을 때의 시간 차이는 엄청납니다. 위의 링크 중 위키피디아 내용을 참고해서 소스를 만들었고, 소수 목록을 파일로 출력하여 따로 볼 수 있게 만들었습니다.

 

파일 저장 경로는 C:\prime.txt 인데, 관리자 계정이 아니거나 UAC가 켜져 있으면 실행하다 오류가 저장이 안되는데, 그럴때는 C드라이브 말고 D드라이브 등으로 경로를 바꿔주고 하면 됩니다.

 

암튼 에라토스테네스의 체의 핵심은 소수를 찾는게 아니라 소수가 아닌 걸 체로 걸러내고 남은 걸 찾는것입니다.

 

#define MAX	2000000

#include <stdio.h>

int main( )
{
	bool	*PrimeArray = new bool[ MAX+1 ];
	double	sum=0;

	for( int i=2 ; i<=MAX ; i++ )
	{
		PrimeArray[i]=true;
	}

	//에라토스테네스의 체에 맞게 소수를 구함
	//만일, PrimeArray[i]가 true이면 i 이후의 i 배수는
	//약수로 i를 가지고 있는 것이 되므로 i 이후의 i 배수에 대해
	//false값을 준다.
	//PrimeArray[i]가 false이면 i는 이미 소수가 아니므로 i의 배수 역시
	//소수가 아니게 된다. 그러므로 검사할 필요도 없다.
	for( int i=2 ; ( i*i )<=MAX ; i++ )
	{
		if( PrimeArray[i] == true )
		{
			for( int j=i+i ; j<=MAX ; j+=i )
			{
				PrimeArray[j] = false;
			}
		}
	}

	//MAX 범위 내의 소수의 합
	for( int i=2 ; i<=MAX ; i++ )
	{
		if( PrimeArray[i] == true )
		{
			sum += i;
		}
	}

	printf( "%.lf\n", sum );
	
	FILE    *pFile;
	pFile = fopen( "D:/prime.txt", "wt" ); 

	for( int i=2 ; i<=MAX ; i++ ) 
	{
		if( PrimeArray[i] == true ) 
		{ 
			fprintf( pFile, "%d\n", i );
		} 
	}

	if( pFile != NULL )
	{
		fclose( pFile );
	}

	//해제
	if( PrimeArray != NULL )
	{
		delete[] PrimeArray;
	}
}


+ Recent posts