Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++로 구현하는 이중 진법 회문 판별 프로그램

이 튜토리얼에서는 주어진 숫자가 서로 다른 두 개의 진법에서 모두 회문(palindrome)인지 확인하는 C++ 프로그램을 작성해 보겠습니다.

하나의 숫자와 다른 진법의 밑(base)이 주어졌을 때, 해당 숫자가 10진수 체계와 주어진 진법 체계 양쪽 모두에서 회문인지 판별하는 것이 목표입니다.

문제 해결 접근 방식

문제를 해결하기 위한 단계는 다음과 같습니다.

  • 확인할 숫자와 변환할 진법의 밑을 초기화합니다.
  • 주어진 숫자가 10진수 체계에서 회문인지 먼저 확인합니다.
  • 숫자를 문자열 형태로 다른 진법으로 변환합니다.
  • 변환된 문자열이 회문인지 확인합니다.
  • 두 진법 모두에서 회문이라면 Yes를, 그렇지 않다면 No를 출력합니다.

C++ 구현 예제

전체 코드를 살펴보겠습니다.

#include <bits/stdc++.h>
using namespace std;

// 숫자를 지정한 진법의 문자열로 변환하는 함수
string integer_to_string(int n, int base) {
    string str;
    while (n > 0) {
        int digit = n % base;
        n /= base;
        str.push_back(digit + '0');
    }
    return str;
}

// 이중 진법 회문 여부를 확인하는 함수
string isDoubleBasePalidrome(int n, int k) {
    int temp = n;
    int number_reverse = 0;
    // 10진수에서 뒤집은 수 계산
    while (temp > 0) {
        number_reverse = temp % 10 + number_reverse * 10;
        temp /= 10;
    }
    if (number_reverse == n) {
        // k진법으로 변환
        string str = integer_to_string(n, k);
        string str_copy = str;
        // k진법 문자열 뒤집기
        reverse(str.begin(), str.end());
        if (str == str_copy) {
            return "Yes";
        }
    }
    return "No";
}

int main() {
    int n = 313, k = 2;
    cout << isDoubleBasePalidrome(n, k) << endl;
    return 0;
}

실행 결과

위 코드를 실행하면 다음과 같은 결과가 출력됩니다.

Yes

예제에서 사용한 숫자 313은 10진수에서도 회문이고, 2진수로 변환하면 100111001이 되어 역시 회문이기 때문에 "Yes"가 출력됩니다.

마무리

이 튜토리얼에서는 하나의 숫자가 두 개의 서로 다른 진법에서 동시에 회문인지 확인하는 방법을 알아보았습니다. 진법 변환 로직과 문자열 뒤집기를 활용하면 손쉽게 구현할 수 있습니다. 튜토리얼에 대해 궁금한 점이 있다면 댓글로 남겨주세요.