UVALive2889 Palindrome Numbers(回文数,神级代码....)

来源:互联网 发布:配置php开发环境 编辑:程序博客网 时间:2024/05/17 04:15


题目链接(Virtual Judge):http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=33603

https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=890

题意:求第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;}


0 0