본문 바로가기
Programming/Project Euler

36. 프로젝트 오일러 #36 : 두개의 진법에서 대칭수

by 작은별하나 2015. 4. 16.
반응형

대칭수인지 결정하는 방법과 대칭수를 만드는 것은 여러가지 방법이 있을 수 있습니다.

이번 문제는 십진수에서 대칭수이면서 이진수에서 대칭수인 수를 찾아서 그 합을 구해야 하죠.  난이도 5%짜리 문제입니다.  (그만큼 어렵지 않다는 것이겠죠.)


사실 십진수 대칭수를 만드는 여러가지 방법이 있겠지만, 저는 약간 복잡하게 대칭수를 만들었습니다.  속도를 빠르게 하기 위한 목적이 있었죠.


13 이라는 숫자가 있다면, 이에 대한 대칭수는 3113, 31013 두가지를 생성해보는 것이죠.  이를 위해서 13이란 숫자에 대한 대칭수인 31을 생성합니다.  그리고 나서 31x100+13 과 31x1000+13 을 이용해서 대칭수를 만듭니다.  이런식으로 1백만 이하의 모든 대칭수를 생성하죠.  사실 for 루프를 이용해서 1~1백만 숫자에 대해서 십진수와 이진수에 대한 대칭수 판단을 해도 됩니다만, 제가 사용하는 방법대로 하면, 이진수에 대한 테스트만 해도 되고, 테스트해야 하는 숫자가 엄청나게 줄어듭니다.  그렇지만, 백만정도의 숫자범위는 그다지 큰 숫자가 아니므로, 편하게 계산하셔도 됩니다.  (사실 굳이 머리 아프게.. ㅠㅠ)


이중 이진수에 대한 대칭수 판단여부 함수만 올리면 다음과 같습니다.


bool IsPalindrome2(int n)
{
    int s = 0;
    int t = n;
    while( t ) { s = (s<<1)|(t&1); t>>=1; }
    if( s != n ) return false;
    return true;
}


728x90

댓글