(C언어)프로젝트 오일러(Project Euler) 4.세자리 수를 곱해 만들 수 있는 가장 큰 대칭수

문제 

앞에서부터 읽을 때나 뒤에서부터 읽을 때나 모양이 같은 수를 대칭수(palindrome)라고 부릅니다.

두 자리 수를 곱해 만들 수 있는 대칭수 중 가장 큰 수는 9009 (= 91 × 99) 입니다.

세 자리 수를 곱해 만들 수 있는 가장 큰 대칭수는 얼마입니까?

코드

#include <stdio.h>

int main(void)
{
    int i, j;    //반복제어변수
    int pal = 0;    //대칭수
    int num = 0;    //임시 수

    for (i = 1; i <= 999; i++)
    {
        for (j = 1; j <= 999; j++)
        {
            num = i * j;
            if (
                num / 100000 == num % 10
                && num / 10000 % 10 == num % 100 / 10
                && num / 1000 % 100 == num % 1000 / 100
                && pal < num
                )
            {
                pal = num;
            }
        }
    }
    printf("%d", pal);

    return 0;
}

실행하면 906609라는 결과값이 출력된다.

맨 처음에는 배열이 생각났는데 정수를 한 자리 한 자리마다 저장하게끔 할 수는 없다.

한 자리 한 자리 분할하려면 어떻게 해야할까를 생각해봤다.

제시된 수를 10의 배수로 나누면 각 자리에 해당하는 수를 얻을 수 있다.

가장 큰 세자리 수인 999끼리 곱한 값은 998001이므로 가장 큰 대칭수는 여섯 자리일 것이라 가정했다.

제시된 수가 654321이라고 하자.

100000으로 나누면 은 6이고, 10으로 나누면 나머지는 1이다. 이 둘을 비교하면 된다.

10000으로 나누면 은 65이고, 100으로 나누면 나머지는 21이다.

을 10으로 나누면 나머지는 5이다. 나머지를 10으로 나누면 은 2이다. 이 둘을 비교하면 된다.

1000으로 나누면 은 654이고, 1000으로 나누면 나머지는 321이다.

을 100으로 나누면 은 4이다. 나머지를 100으로 나누면 은 3이다. 이 둘을 비교하면 된다.

검증한 num에 저장된 값이 이전에 pal에 저장된 값보다 크면 그 값을 pal에 저장한다.