/*
47とその反転を足し合わせると, 47 + 74 = 121となり, 回文数になる.
全ての数が素早く回文数になるわけではない. 349を考えよう,
349 + 943 = 1292,
1292 + 2921 = 4213
4213 + 3124 = 7337
349は, 3回の操作を経て回文数になる.
まだ証明はされていないが, 196のようないくつかの数字は回文数にならないと考えられている.
反転したものを足すという操作を経ても回文数にならないものをLychrel数と呼ぶ.
先のような数の理論的な性質により, またこの問題の目的のために,
Lychrel数で無いと証明されていない数はLychrel数だと仮定する.
更に, 10000未満の数については,常に以下のどちらか一方が成り立つと仮定してよい.
50回未満の操作で回文数になる
まだ誰も回文数まで到達していない
実際, 10677が50回以上の操作を必要とする最初の数である:
4668731596684224866951378664 (53回の操作で28桁のこの回文数になる).
驚くべきことに, 回文数かつLychrel数であるものが存在する. 最初の数は4994である.
10000未満のLychrel数の個数を答えよ.
*/
#include <stdio.h>
int isPalindromicNumRec(int num[], int size) {
if( size == 1 ) return 1;
if( size == 2 ) return num[0] == num[size - 1];
return num[0] == num[size - 1] ? isPalindromicNumRec(num + 1, size - 2) : 0;
}
int isPalindromicNum(long long int num) {
int ary[30];
int digit = 0;
long long tmp = num;
while( tmp > 0 ) {
ary[digit++] = tmp % 10;
tmp /= 10;
}
return isPalindromicNumRec(ary, digit);
}
long long int reverseNum(long long int num) {
long long int tmp = num;
long long int rep = 0;
while( tmp > 0 ) {
rep = rep * 10 + tmp % 10;
tmp /= 10;
}
return rep;
}
int main(void) {
int cnt = 0;
long long int tmp;
long long int num;
int i;
for( num = 1; num < 10000; num++ ) {
tmp = num + reverseNum(num);
for( i = 1; i < 25; i++ ) {
if( isPalindromicNum(tmp) ) break;
tmp = tmp + reverseNum(tmp);
}
if( i == 25 ) {
cnt++;
}
}
printf("%d\n", cnt);
return 0;
}