回文数

回文数

 

Time Limit:   1000MS       Memory Limit:   65535KB
Submissions:   70       Accepted:   12

 

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

 

解析:

这道题是找第i小的回文数,首先看一下回文数不同位数所对应的不同个数:

1~9:9个;11~99:9个;101~999:9X10个;1001~9999:9X10个;10001~99999:9X10X10个······

可见位数和个数存在很强的规律性,也就说可以根据i的值确定其的位数,那么在确定其值,这样就容易多了,代码如下:

# include<stdio.h>
int main()
{
    long long num,add,sign;
    int odd,len,i;
    int str[1005];
    scanf("%lld",&num);
    if(num<=9)
        printf("%lld\n",num);
    else
    {
        add=0;
        odd=0;
        sign=9;
        while(add<num)//利用规律
        {
            odd+=2;
            add+=2*sign;
            sign*=10;
        }
        sign/=10;
        add-=sign;
        odd--;
        if(add<num)//精确得到位数odd,以及该位数前有多少回文数add
            odd++;
        else add-=sign;
        num-=add+1;
        len=(odd-1)/2;
        for(i=len;i>=0;i--)
        {
            str[i]=num%10;//得到中间的数值
            str[odd-i-1]=num%10;//依次用同样的方法确定其他位置的数值
            num/=10;
        }
        str[0]++;//首位和末尾是从1开始,不是从0开始的,就得都加1
        str[odd-1]++;
        for(i=0;i<odd;i++)
            printf("%d",str[i]);
        printf("\n");
    }
    return 0;
}

 

 

posted on 2013-02-26 12:27  即为将军  阅读(626)  评论(0)    收藏  举报

导航