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 }