코드

회문 숫자 식별하기

ehei 2012. 1. 14. 23:25

회문 숫자인지 알아내기 위해 숫자를 뒤집는 코드를 짜다가 밤을 새버렸네... 메타템플릿 버전을 짜려다 보니 이렇게 되버렸다. 후헐... 얼랭 책을 읽고 있는데, 덕분에 재귀에 빠져버렸다... ^^ 이러다 스택 오버플로 나야 정신을 >_<; 


1326487992_testReverse.cpp

  

// 메타 템플릿 버전. 당연히 초고속인데 리터럴 상수만 쓸 수 있는게 아쉽...

template< int input, int result >
struct ReverseMeta
{ enum { value = ReverseMeta< input / 10, result * 10 + input % 10 >::value }; };

 

template< int result >
struct ReverseMeta< 0, result >
{ enum { value = result }; };

 

template< int input, int result = 0 >
struct IsPalindromeMeta

{ enum { value = (input == ReverseMeta< input, result >::value) }; };

그리고 이건 재귀 버전 ^^

// 람다 재귀 버전. 어쨌든 템플릿이니까 그래도 좀 낫겠지

bool IsPalindrome(int input)
{
    const std::function< int(int, int) >func = [&func](int input, int result) -> int {
        const int quotient = input / 10;

        return 0 == quotient ? result * 10 + input : func(quotient, result * 10 + input % 10);
    };

 

    return input == func(input, 0);
}

압박 속에서 짠 단순 버전 -_-

bool IsPalindromeOld(int input)
{
    int array[20] = {};
    int* forwardPointer = array;
    int* backwardPointer = array + _countof(array) - 1;

 

    do 
    { 
        const int quotient = input % 10;
        *forwardPointer = quotient;
        ++forwardPointer;

        *backwardPointer = quotient;
        --backwardPointer;

        input /= 10;
    } while (0 < input);

 

    return 0 == memcmp(array, backwardPointer + 1, sizeof(*array) * (forwardPointer - array));
}

사용 예~

std::cout << IsPalindromeMeta< 56765 >::value << std::endl; // true, 앗싸
std::cout << IsPalindromeMeta< 0 >::value << std::endl; // true, ^o^

std::cout << IsPalindromeOld(3421)  << std::endl; // false, 후헐
std::cout << IsPalindromeOld(56765)  << std::endl; // true ^o^