47이란 숫자를 골라서 뒤집은 다음 다시 원래 수에 더하면, 47 + 74 = 121 과 같이 대칭수(palindrome)가 됩니다.
물론 모든 숫자가 이토록 쉽게 대칭수를 만들어내지는 않습니다. 예를 들어 349의 경우,349 + 943 = 1292
1292 + 2921 = 4213
4213 + 3124 = 7337위에서 보는 것처럼 3번의 반복과정을 거쳐야 대칭수가 됩니다.
196과 같은 몇몇 숫자들은 이와 같은 과정을 아무리 반복해도 대칭수가 되지 않을 것이라고 추측되는데, 이런 수를 라이크렐 수 (Lychrel number) 라고 부릅니다. 아직 증명되지는 않았지만, 문제 풀이를 위해서 일단 라이크렐 수가 존재한다고 가정을 하겠습니다.
또한 1만 이하의 숫자들은, 50번 미만의 반복으로 대칭수가 되든지 라이크렐 수이든지 둘 중 하나라고 합니다.
1만을 넘어서면 10677에 이르렀을 때 비로소 53번의 반복으로 4668731596684224866951378664 라는 28자리의 대칭수가 만들어집니다.그러면 1만 이하에는 몇 개의 라이크렐 수가 존재합니까?
굳이 Math::BigInt를 사용하지 않아도 정답은 나오지만, 경고 투성이인 터미널을 보기 안타까워 BigInt를 썼는데…
이상하게도 a==b 으로 할 때와 a-b==0 으로 할 때가 달라서 한참 멘붕.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
#!/usr/bin/env perl use 5.010; use strict; use warnings; use Math::BigInt; my $c = 0; for (1..10000) { my $n = Math::BigInt->new($_); for (1..50) { $n->badd(Math::BigInt->new(scalar reverse $n->bstr())); last if ($n == Math::BigInt->new(scalar reverse $n->bstr())); $c++ if ($_ == 50); } } say $c; |