link : https://www.acmicpc.net/problem/2960
에라토스테네스의 체 성공
문제
에라토스테네스의 체는 N보다 작거나 같은 모든 소수를 찾는 유명한 알고리즘이다.
이 알고리즘은 다음과 같다.
- 2부터 N까지 모든 정수를 적는다.
- 아직 지우지 않은 숫자 중 가장 작은 수를 찾는다. 이것을 P라고 하고, 이 수는 소수이다.
- P를 지우고, 아직 지우지 않은 P의 배수를 크기 순서대로 지운다.
- 아직 모든 숫자를 지우지 않았다면, 다시 2번 단계로 간다.
N, K가 주어졌을 때, K번째 지우는 수를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 N과 K가 주어진다. (1 ≤ K < N, max(2, K) < N ≤ 1000)
출력
첫째 줄에 K번째 지워진 수를 출력한다.
예제 입력 1
10 7
예제 출력 1
9
에라토스테네스의 체 문제라고 해서 소수를 구하는 줄 알았는데 그 로직을 이용해서 다른 답을 구하는 문제였다.
간단하게 해결!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | #include<iostream> #include<math.h> using namespace std; #define MAX 1000 int num[MAX]; int n,k,cnt; int func(){ for(int i=2; i<=n;i++){ if(num[i] == 0) continue; for(int j=i;j<=n;j+=i){ if(num[j] == 0) continue; num[j] = 0; cnt++; if(cnt == k) return j; } } return -1; } int main(){ cin >> n >> k; for(int i=2;i<=n;i++) num[i] = i; cout << func(); return 0; } | cs |
'Programming > BOJ Solutions' 카테고리의 다른 글
[백준 1644번] 소수의 연속합 (0) | 2018.08.22 |
---|---|
[백준 11653번] 소인수분해 (0) | 2018.08.22 |
[백준 1735번] 분수 합 (0) | 2018.08.22 |
[백준 1753번] 최단경로 (0) | 2018.08.21 |
[백준 1922번] 네트워크 연결 (0) | 2018.08.21 |