Problem:
回文数

Problem Statement

整数nに最も近い回文数を求めよ．

なお，非負整数xが回文数であるとは，xを十進法で表現した文字列とそれを反転させた文字列が等しいことをいう．

例えば0,7,33,10301などは回文数であり，32,90,1010などは回文数でない．

Input

入力は以下の形式に従う．与えられる数は全て整数である．

n

Constraints

1≦n≦10^4

Output

nに最も近い回文数を出力せよ．

そのような数が複数ある場合は最も小さいものを出力せよ．

Sample Input 1

13

Output for the Sample Input 1

11

13に最も近い回文数は11である．

Sample Input 2

7447

Output for the Sample Input 2

7447

7447は回文数なのでそのまま出力すればよい．

Sample Input 3

106

Output for the Sample Input 3

101

106に最も近い回文数は111と101のふたつあるが，そのうち小さい方の101を出力する．

Solution in C++ (judge verdict: Accepted)

#include <iostream>
#include <sstream>
#include <string.h>

using namespace std;

void solve()
{
	bool isPalinNum[10010];
	memset(isPalinNum, 0, sizeof(isPalinNum));
	for(int i = 1; i < 10010; ++i)
	{
		stringstream ss;
		ss << i;
		bool flag = true;
		string s = ss.str();
		for(int j = 0; j < s.size() / 2; ++j)
		{
			if(s[j] != s[s.size() - j - 1])
			{
				flag = false;
				break;
			}
		}
		if(flag)
		{
			isPalinNum[i] = true;
		}
	}
	int n;
	cin >> n;
	if(isPalinNum[n])
	{
		cout << n << endl;
	}
	else
	{
		int ans_cand[2] = {0};
		for(int i = n - 1; i >= 0; --i)
		{
			if(isPalinNum[i])
			{
				ans_cand[0] = i;
				break;
			}
		}
		for(int i = n + 1; i < 10010; ++i)
		{
			if(isPalinNum[i])
			{
				ans_cand[1] = i;
				break;
			}
		}
		if(n - ans_cand[0] <= ans_cand[1] - n)
		{
			cout << ans_cand[0] << endl;
		}
		else
		{
			cout << ans_cand[1] << endl;
		}
	}
}

int main()
{
	solve();
	return(0);
}