문제
앞에서부터 읽을 때나 뒤에서부터 읽을 때나 모양이 같은 수를 대칭수(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에 저장한다.