LA 2889 (找规律) Palindrome Numbers

输出第n个回文数。

规律就是一位和两位的回文数各有9个,三位四位的回文数各有90个,以此类推。

给出n,可以先判定一下第n个回文数的位数,然后后面也不难推,但是有很多细节需要注意。

 1 #include <cstdio>
 2 #include <algorithm>
 3 #include <cassert>
 4 using namespace std;
 5 typedef long long LL;
 6 
 7 const int maxl = 20;
 8 
 9 LL a[maxl + 1], sum[maxl + 1], pow10[maxl];
10 
11 int main()
12 {
13     //freopen("in.txt", "r", stdin);
14 
15     pow10[0] = 1;
16     for(int i = 1; i <= 10; i++) pow10[i] = pow10[i - 1] * 10;
17 
18     a[1] = 9;
19     for(int i = 2; i <= maxl; i++)
20     {
21         if(i % 2 == 0) a[i] = a[i - 1];
22         else a[i] = a[i-1] * 10;
23     }
24     for(int i = 1; i <= maxl; i++) sum[i] = sum[i - 1] + a[i];
25     //for(int i = 1; i <= maxl; i++) printf("%lld\n", sum[i]);
26 
27     int n;
28     while(scanf("%d", &n) == 1 && n)
29     {
30         n--;
31         int digits = upper_bound(sum+1, sum+1+maxl, n) - sum;
32         //printf("%d\n", digits);
33         int f = (digits - 1) / 2;   //自由元的个数
34         LL x = n - sum[digits - 1];
35         LL t = x / pow10[f] + 1;  //最高位数字
36         assert(t < 10);
37         LL l = x % pow10[f];
38         char s[20];
39         s[0] = t + '0';
40         if(f)
41         {
42             for(int i = f; i > 0; i--)
43             {
44                 s[i] = l % 10 + '0';
45                 l /= 10;
46             }
47             assert(l == 0);
48         }
49         for(int i = f+1; i < digits; i++) s[i] = s[digits-1-i];
50         s[digits] = 0;
51         printf("%s\n", s);
52     }
53 
54     return 0;
55 }
代码君

 

posted @ 2015-03-22 22:27  AOQNRMGYXLMV  阅读(322)  评论(0编辑  收藏  举报