본문 바로가기

문제풀이/C++

[C++] 뒤집은 소수

728x90

[목적]

N개의 자연수를 입력 받은 후 수를 하나씩 뒤집어 그 수가 소수이면 출력한다.

 

[입력 예제]

5
32 55 62 3700 250

 

[출력 예제]

23 73

입력 받고 싶은 개수를 입력 한 후, 여기선 '5'개를 입력받는다 하였기에 총 '5'개의 숫자를 입력받는다.

그 후, 숫자를 뒤집어 해당 수가 소수이면 출력하는데 여기선 '32'와 '3700'을 뒤집었을 때 '23'과 '73'(앞자리 0은 무시)으로 두 수는 소수이기에 '23'과 '73'을 출력한다.

 


[코드 (Visual Studio2019)]

#include <iostream>
#include <string>

using namespace std;
bool isPrime(int x) {

    if (x == 1) return false;

    for (int i = 2; i * i <= x; i++) {
        if (x % i == 0) return false;
    }
    return true;
}

int reverse(int x) {

    string str = to_string(x);
    reverse(str.begin(), str.end());
    int num = stoi(str);
    if ((isPrime(num)) == true) cout << num << " ";

    return 0;
}


int main(void) {

    int cnt, num;

    cin >> cnt;

    for (int i = 1; i <= cnt; i++) {
        cin >> num;
        reverse(num);
    }

    return 0;
}

isPrime 함수는 소수인지 판별해주는 함수이다.

1은 소수가 아니니 무조건 false를 return하고, 그 외에 숫자는 1을 모두 약수로 가지기에 for문은 2부터 시작한다.

시간 복잡도를 위해 i * i가 입력받은 숫자보다 작거나 같을때까지만 반복해준다.

 

예제) x = 25

i i * i x % i
2 4 2
3 9 3
4 16 4
5 25 0

i가 5일 때 '%'연산을 한 값이 0이 나와 소수가 아니라 판별되어 false를 return한다.

 

예제2) x =7

i i * i x % i
2 4 2
3 9 ----

7은 1과 자기자신만을 갖는 소수이다.

이때 2부터 7까지 for문을 돌리는건 시간 낭비가 될 수 있다.

그래서 i * i연산을 통해 반보다 작은 숫자를 돌려 범위를 벗어나게 되면 for문을 나가게 되고 true가 반환되도록 하였다.

 

[실행결과]

[코드 (DevC++)]

Dev는 GCC컴파일러를 사용하기에 to_string과 stoi같은 함수를 사용할 수 없다.

컴파일러를 C++11로 바꿀 수 있지만 컴퓨터의 문제인지.. 돌아가지 않는다...

아래 코드는 reverse함수를 수정한 코드이다.

#include <iostream>
#include <string>

using namespace std;

int reverse(int x) {

    int res=0, tmp;
    while(x>0){
        tmp=x%10;
        res=res*10+tmp;
        x=x/10;
    }
    return res;
}

bool isPrime(int x) {

    if (x == 1) return false;

    for (int i = 2; i * i <= x; i++) {
        if (x % i == 0) return false;
    }
    return true;
}

int main(void) {

    int cnt, num, tmp;

    cin >> cnt;

    for (int i = 1; i <= cnt; i++) {
		cin >> num;
        tmp = reverse(num);
        if(isPrime(tmp)) cout << tmp << " ";
    }

    return 0;
}
728x90
반응형

'문제풀이 > C++' 카테고리의 다른 글

[C++] Anagram  (0) 2021.01.01
[C++] 소수의 개수  (0) 2021.01.01
[C++] 가장 많이 사용된 자릿수  (0) 2020.12.29
[C++] 숫자의 총 개수 (small)  (0) 2020.12.29
[C++] 자릿수의 합  (0) 2020.12.28