에라토스테네스의 체를 이용한 문제는 프로젝트 오일러 사이트에 올라온 문제이기도 하며, 에라토스테네스의 체를 이용 안하고 풀었을 때와 이용 했을 때의 시간 차이는 엄청납니다. 위의 링크 중 위키피디아 내용을 참고해서 소스를 만들었고, 소수 목록을 파일로 출력하여 따로 볼 수 있게 만들었습니다.
파일 저장 경로는 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; } }
'예제 모음 > 정보처리기사-수학' 카테고리의 다른 글
[정보처리기사] 배수의 개수와 합 - C언어 구현 (0) | 2013.03.31 |
---|---|
[정보처리기사] 최대값, 최소값 구하기 - C언어 구현 (0) | 2013.03.31 |
[정보처리기사] 약수 구하기 - C언어 구현 (2) | 2013.03.31 |
[정보처리기사] 소인수 분해 - C언어 구현 (0) | 2013.03.31 |
[정보처리기사] 최대 공약수(gcm), 최소공배수(lcm) - C언어 구현 (0) | 2013.03.31 |
[정보처리기사] 소수의 합 - C언어 구현 (0) | 2013.03.31 |
[정보처리기사] 소수 판별 - C언어 구현 (0) | 2013.03.31 |