1+ #include < iostream>
2+ #include < vector>
3+ #include < chrono>
4+ using namespace std ;
5+ using namespace chrono ;
6+
7+ // Prime Number 소수 개수 구하기
8+ // 소수란 자신을 제외한 자연수로는 나누어 떨어지지 않는 자연수
9+
10+ // 1) 모든 수에 대해 약수가 있는지 확인
11+ void ex015_1 (int N) {
12+ auto start = duration_cast<milliseconds>(system_clock::now ().time_since_epoch ()).count ();
13+
14+ int count = 0 ;
15+ for (int j = 2 ; j < N; j++) {
16+ bool flag = true ;
17+ for (int i = 2 ; i < j; i++) {
18+ if (j % i == 0 ) {
19+ flag = false ;
20+ break ;
21+ }
22+ }
23+ if (flag) count++;
24+ }
25+
26+ auto dur = duration_cast<milliseconds>(system_clock::now ().time_since_epoch ()).count () - start;
27+ cout << " (1) 1 부터 " << N << " 까지 사이에 존재하는 소수 개수 : " << count << " ex015_1 Dur time :: " << dur << " milliseconds" << endl;
28+ }
29+
30+ // 2) 모든 약수가 가운데 약수를 기준으로 대칭을 갖는 성질 이용 (제곱근까지만 확인 하면 됨)
31+ void ex015_2 (int N) {
32+ auto start = duration_cast<milliseconds>(system_clock::now ().time_since_epoch ()).count ();
33+
34+ int count = 0 ;
35+ for (int j = 2 ; j < N; j++) {
36+ bool flag = true ;
37+ for (int i = 2 ; i * i <= j; i++) {
38+ if (j % i == 0 ) {
39+ flag = false ;
40+ break ;
41+ }
42+ }
43+ if (flag) count++;
44+ }
45+
46+ auto dur = duration_cast<milliseconds>(system_clock::now ().time_since_epoch ()).count () - start;
47+ cout << " (2) 1 부터 " << N << " 까지 사이에 존재하는 소수 개수 : " << count << " ex015_2 Dur time :: " << dur << " milliseconds" << endl;
48+ }
49+
50+ // 3) 에라토스테네스의 체 알고리즘 이용
51+ // 1. 2부터 N까지 모든 자연수 나열
52+ // 2. 남은 자연수 중 처리되지 않은 가장 작은 수 찾기
53+ // 3. 2번 에서 찾은 가장 작은 수의 배수를 모두 제거 (해당 작은 수는 제거하지 않는다.)
54+ // 4. 끝까지 2번과 3번을 반복
55+ void ex015_3 (int N) {
56+ auto start = duration_cast<milliseconds>(system_clock::now ().time_since_epoch ()).count ();
57+
58+ int count = 0 ;
59+ vector<int > container (N);
60+ for (int i = 2 ; i < N; i++) {
61+ container[i] = i; // 2부터 N까지 모든 자연수 나열
62+ }
63+
64+ for (int i = 2 ; i < N; i++) {
65+ if (container[i] == 0 ) continue ; // 이미 처리 榮摸 통과
66+ for (int j = i + i; j < N; j += i) {// 해당 작은 수를 제거하지 않도록 i+i에서 시작
67+ container[j] = 0 ; // 해당 가장 작은 수의 배수를 모두 제거
68+ }
69+ }
70+
71+ for (int i = 2 ; i < N; i++) {
72+ if (container[i] != 0 ) count++; // 소수 카운트
73+ }
74+
75+ auto dur = duration_cast<milliseconds>(system_clock::now ().time_since_epoch ()).count () - start;
76+ cout << " (3) 1 부터 " << N << " 까지 사이에 존재하는 소수 개수 : " << count << " ex015_3 Dur time :: " << dur << " milliseconds" << endl;
77+ }
78+
79+
80+ // int main() {
81+ // int max = 399999;
82+ // ex015_1(max);
83+ // ex015_2(max);
84+ // ex015_3(max);
85+ // return 0;
86+ // }
87+ // (1) 1 부터 399999 까지 사이에 존재하는 소수 개수 : 33860 ex015_1 Dur time :: 10670 milliseconds
88+ // (2) 1 부터 399999 까지 사이에 존재하는 소수 개수 : 33860 ex015_2 Dur time :: 37 milliseconds
89+ // (3) 1 부터 399999 까지 사이에 존재하는 소수 개수 : 33860 ex015_3 Dur time :: 335 milliseconds
0 commit comments