[ create a new paste ] login | about

Link: http://codepad.org/yk4p68Hf    [ raw code | output | fork ]

C, pasted on Mar 30:
/*
	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;
}


Output:
1
249


Create a new paste based on this one


Comments: