문제
앞뒤가 같은 수를 대칭수, 회문수라고 한다.
10진수, 2진수, 8진수 어느 것으로도 대칭수가 되는 수 중, 10진수의 10 이상의 최솟값을 구하라.
풀이
먼저, 2진수에서 대칭이 되려면 제일 앞자리와 뒷자리 모두가 1이 되어야 하는데,
2진수에서 제일 뒷자리가 1이라는 것은 홀수를 의미하므로 홀수인 수에서만 조건을 만족하는지 확인하면 된다.
toBin과 toOct는 숫자를 각각 2진수, 8진수로 변환하는 함수이다.
10진수를 n진수로 변환하는 방법은 해당 수가 n보다 작을때까지 나누면서 나오는 나머지를 뒤부터 써내려 가면 된다. => str.insert(0, temp) 부분으로 새롭게 나오는 나머지를 제일 앞에 추가함으로 구현
코드
더보기
#include <iostream>
#include <string>
using namespace std;
string toBin(int num); // 10진수를 2진수로
string toOct(int num); // 10진수를 8진수로
bool check(string str); // 해당 수가 대칭수인지 확인
int main() {
int num = 11; // 10이상의 가장 작은 홀수 11
while (true) {
string ten_str = to_string(num);
string bin_str = toBin(num);
string oct_str = toOct(num);
if (check(ten_str) && check(bin_str) && check(oct_str)) { // 10, 2, 8진수로 변환했을 때 모두 대칭수인 경우
cout << "Num : " << num << " Bin : " << bin_str << " Oct : " << oct_str << endl;
break;
}
num += 2;
}
}
string toBin(int num) {
string str;
while (num > 1) {
string temp = to_string(num % 2);
str.insert(0, temp);
num = num / 2;
}
if (num != 0) // 끝까지 나눴을때 나머지가 0인 경우는 제일 앞자리도 0이기 때문에 추가하지 않음
str.insert(0, to_string(num));
return str;
}
string toOct(int num) {
string str;
while (num > 1) {
string temp = to_string(num % 8);
str.insert(0, temp);
num = num / 8;
}
if(num != 0)
str.insert(0, to_string(num));
return str;
}
bool check(string str) {
for (int i = 0; i < str.length() / 2; i++) {
if (str[i] != str[str.length() - i - 1]) // 양쪽 끝에서부터 하나씩 중간으로 오면서 비교
return false;
}
return true; // 모두 비교했을 때 같은 경우
}