A palindrome is a word, number, or phrase that reads the same forwards as backwards. For example, the name "anna" is a palindrome. Numbers can also be palindromes (e.g.151 or 753357). Additionally numbers can of course be ordered in size. The first few palindrome numbers are:1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 22, 33, ...
The number 10 is not a palindrome (even though you could write it as010) but a zero as leading digit is not allowed.
Input
The input consists of a series of lines with each line containing one integer value i (1 <= i <= 2*109). This integer value i indicates the index of the palindrome number that is to be written to the output, where index 1 stands for the first palindrome number (1), index 2 stands for the second palindrome number (2) and so on. The input is terminated by a line containing 0.Output
For each line of input (except the last one) exactly one line of output containing a single (decimal) integer value is to be produced. For each input value i the i-th palindrome number is to be written to the output.Sample Input
1 12 24 0
Sample Output
1 33 151
解题报告:求第K个回文数。统计每段区间有多少个回文数,二分查找所在区间,计算即可。很容易找到规律,101,111,121,131,……,191,202,……,999。相当于是10-99的奇数位回文数,一共90个。1001,1111,1221,1331,……,1991,2002,9999。相当于10-99偶数位回文数。
代码如下:
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
typedef long long LL;
LL ten[20];
LL num[20];
LL sum[20];
void init()
{
ten[0]=1;
for(int i=1;i<10;i++)
ten[i]=ten[i-1]*10;
for(int i=0;i<=20;i+=2)
num[i] = num[i+1] = ten[i/2]*9;
sum[0]=num[0];
for(int i=1;i<=20;i++)
sum[i]=sum[i-1]+num[i];
}
int str[1000];
int top;
void LLtoStr(LL n)
{
top=0;
while(n)
str[top++]=n%10,n/=10;
}
void work(LL n)
{
int pos = lower_bound(sum,sum+20,n)-sum;
LL ans = ten[pos/2]+(pos>0?n-sum[pos-1]-1:n-1);
LLtoStr(ans);
for(int i=top-1;i>=0;i--) printf("%d",str[i]);
for(int i=pos&1?0:1;i<top;i++) printf("%d",str[i]);
puts("");
}
int main()
{
init();
LL n;
while(cin>>n && n)
work(n);
}
PS:我WA 了很多次,因为数组开成20,而循环终止条件写成i<=20。本次测试没问题,提交上去后就报错了。以后一定要注意数组的大小,在这个上面WA过很多次了。