题目链接(Virtual Judge):http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=33603
题意:求第n个回文数.回文数从小到大的排列为1,2,3,4,5,6,7,8,9,11,22...
输入n(1<=n<=2*10^9),求第n小的回文数.如,第24小的回文数为151.
原来打算把素数存在数组里,后来发现不行.网上看到了神级代码....
思路:可以算出来第N个回文数字,长度多长而且是该长度第几个回文串。因为1位数有9个,2位数9个,3位数90,4位数90,可以预处理出来。
当我们知道长度的时候,也知道是第几个的时候,直接将第几个-1然后加上一半长度的回文数字。
比如:24 可以求出他的回文长度是3,是第6个。
回文长度为3,他的第一个数101,他的左半部分是10
6-1=5; 用5直接加上他的左半部分就可以了。15
那么将15反着输出,并且他的长度为3.所以只输出1.
则就是151;
思路是别人的,但我的代码和TA的不同.
AC代码:
#include<iostream>
using namespace std;
int main()
{
int n;
while(cin>>n,n)
{
long long x = 0;
while(n>x*2)
x = x*10+9;
if(n>x+x/10)
{
n-=x;
cout<<n;
while(n>0)
{
cout<<n%10;
n/=10;
}
}
else
{
n-=x/10;
cout<<n;
n/=10;
while(n>0)
{
cout<<n%10;
n/=10;
}
}
cout<<endl;
}
return 0;
}