[BOJ]1747 소수&팰린드롬

Posted by kyoungIn on March 25, 2019

소수&팰린드롬

시간 제한 메모리 제한 제출 정답 맞은 사람 정답 비율
2 초 256 MB 5009 1134 828 23.684%

문제

어떤 수와 그 수의 숫자 순서를 뒤집은 수가 일치하는 수를 팰린드롬이라 부른다. 예를 들어 79,197과 324,423 등이 팰린드롬 수이다.

어떤 수 N (1 ≤ N ≤ 1,000,000)이 주어졌을 때, N보다 크거나 같고, 소수이면서 팰린드롬인 수 중에서, 가장 작은 수를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 N이 주어진다.

출력

첫째 줄에 조건을 만족하는 수를 출력한다.

예제 입력 1

1
31

예제 출력 1

1
101

풀이

팰린드롬 계산하는 것을 문자열로 바꿔서 풀었는데,

1
2
3
4
5
6
7
8
bool pldr(int num){
  int a=0, b=num
  while(b!=0){
    a= a*10 + b%10;
    b= b/10;
  }
  return a==num;
}

으로 풀 수 있다는 것을 배웠다.

num = 1221

a b
0 1221
1 122
12 12
122 1
1221 0

num = 2345

a b
0 2345
5 234
54 23
543 2
5432 0

또! ! N (1 ≤ N ≤ 1,000,000) 이라고 소수배열의 범위를 1,000,000으로 하면 안된다 !

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
34
35
36
#include <iostream>
#include <math.h>
using namespace std;

int pn[10000000];
void prime(){
    pn[0]=1;pn[1]=1;
    for(int i=2;i<=sqrt(10000000);i++){
        if(pn[i]==1) continue;
        for(int j=2;i*j<=10000000;j++)
            pn[i*j]=1;
    }
}
bool pldr(int num){
    string s=to_string(num);
    int i=0,j=(int)s.length()-1;
    while(i<j){
        if(s[i]!=s[j])
            return false;
        i++;
        j--;
    }
    return true;
}

int main(){
    prime();
    int n ; cin >> n;
    for(int i=n;;i++){
        if(pn[i]==1) continue;
        if(pldr(i)==true){
            cout << i << '\n';
            break;
        }
    }
}