제일 큰 수가 1,000,000으로 for문을 돌며 모든 수를 검사하면 시간초과가 난다. 2가지 방법으로 시간을 줄여보자. (+ endl 쓰면 모든 방법에서 시간초과 나니 '\n'로..)
1. 에라토스테네스의 체 방법
2부터 시작해서 해당 수를 제외한 해당 수의 배수들을 제거한다.
#include<iostream>
using namespace std;
#define size 1000001
int a[size] = { 0,1 };
int main() {
int M, N;
cin >> M >> N;
for (int i = 2; i <= N; i++)
for (int j = 2; i * j <= N; j++)
a[i * j] = 1;
for (int i = M; i <= N; i++)
if (!a[i]) cout << i << '\n';
return 0;
}
2. 소수와 제곱근
그 수의 제곱근까지로 범위를 제한해서 소수인지 판별해도 된다.
#include <iostream>
#include <cmath>
using namespace std;
int main() {
int M, N;
cin >> M >> N;
int max;
for (int i = M; i <= N; i++) {
int flag = 0;
max = sqrt(i);
if (max == 1 && i != 1) cout << i << '\n'; //제곱근이 1인 2,3은 소수이니 출력
else {
for (int j = 2; j <= max; j++) {
if (i % j == 0) break;
if (j==max) cout << i << '\n';
}
}
}
return 0;
}
3. 부르트 포스 방법 (시간초과)
#include<iostream>
using namespace std;
bool IsPrime(int a) {
if (a == 1) return false;
for (int j = 2; j < a; j++) {
if (a % j == 0) return false;
}
return true;
}
int main() {
int M, N;
cin >> M >> N;
for (int i = M; i <= N; i++) {
if (IsPrime(i)) cout << i << endl;
}
return 0;
}
'Programming > BOJ' 카테고리의 다른 글
[백준/C++] 2805번: 나무 자르기 (이분탐색) (0) | 2020.12.02 |
---|---|
[백준/C++] 2661번: 좋은수열 (DFS, 백트랙킹) (0) | 2020.11.26 |
[백준/C++] 9095번: 1,2,3 더하기 (DFS/DP) (0) | 2020.11.25 |
[백준/C++] 9663번: N-Queen (DFS, 백트랙킹) (0) | 2020.11.24 |
[백준/C++] 1182번: 부분수열의 합 (DFS) (0) | 2020.11.24 |