Description
一个自然数如果把所有数字倒过来以后和原来的一样,那么我们称它为回文数。例如151和753357。我们可以把所有回文数从小到大排成一排:1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 22, 33, ...注意10不是回文数,虽然我们可以把它写成010,但是在本题中前导0是不允许的。 你的任务是求出第i小的回文数。例如第1,12,24大的回文数分别是1,33,151。
Input
输入只有一行,即i(1<=i<=2*10^9)。
Output
输出只有一行,即第i小的回文数。
Sample Input
24
Sample Output
151
程序1:
#include<iostream>
#include<math.h>
using namespace std;
int main()
{
long n;
int k=1;
long l;
cin>>n;
while(1)
{
if(n<=9*pow((double)10,(k-1)/2))break;
n-=9*pow((double)10,(k-1)/2);
k++;
}
l=pow((double)10,(k-1)/2);
l+=n-1;
cout<<l;
l/=k%2==1?10:1;
while(l)
{
cout<<l;
l/=10;
}
cout<<endl;
}
程序2:
#include<iostream>
using namespace std;
int n;
void solve()
{
if (n<=9) cout<<n<<endl;
else
{
long long bit=2,tot=9,delta=9;
while (tot+delta<n)
{
tot+=delta;
bit++;
if ((bit&1)==1) delta*=10;
}
delta=n-tot;
long long st=1;
long long times=bit/2;
if (bit&1) times++;
for (int i=1;i<times;i++) st*=10;
st=st+delta-1;
cout<<st;
if (bit&1) st/=10;
while (st){
cout<<(st);
st/=10;
}
cout<<endl;
}
}
int main(){
while (cin>>n&&n)
{
solve();
}
}