문제 요약 : 어떤 수가 입력으로 들어옵니다. 이 수의 양옆에 있는 가장 가까운 소수 사이의 길이를 구하는 문제입니다. 입력된 수가 소수라면 0을 출력하면 됩니다.
예를 들어, 4가 입력되면 4보다 작은 소수는 3이고, 4보다 큰 소수는 5입니다. 따라서 답은 2가 됩니다.
해결 방법 : 에라토스테네스의 체를 이용해서 소수를 미리 구해두고, 문제를 풀면 정말 쉬운 문제입니다.
결과 : Accepted
소스코드
#include<iostream>
#include<cmath>
using namespace std;
const unsigned int MAX_NUM = 1299709;
unsigned int n;
unsigned int prime[MAX_NUM + 1];
unsigned int sqrtMaxNum = sqrt((double)MAX_NUM);
void makePrime() {
//모두 1로 초기화
for(int i = 1; i <= MAX_NUM; i++) {
prime[i] = 1;
}
for(int i = 2; i <= sqrtMaxNum; i++) {
if(prime[i] == 1) {
for(int j = 2 * i; j <= MAX_NUM; j+= i) {
prime[j] = 0;
}
}
}
}
int main() {
//freopen("input.txt", "r", stdin);
makePrime();
while(true) {
cin >> n;
if(n == 0) return 0;
if(prime[n] == 1) cout << 0 << endl;
else {
int start = n-1;
int end = n+1;
while(true) {
if(prime[start] == 1) break;
start--;
}
while(true) {
if(prime[end] == 1) break;
end++;
}
cout << end - start << endl;
}
}
return 0;
}
'알고리즘' 카테고리의 다른 글
| Palindrome Numbers (2) | 2010.08.05 |
|---|---|
| The Tourist Guide (0) | 2010.08.03 |
| Word Index (0) | 2010.07.31 |
| Knights Move (0) | 2010.07.29 |