LA 2889 (找规律) Palindrome Numbers
2015-03-22 22:27
381 查看
输出第n个回文数。
规律就是一位和两位的回文数各有9个,三位四位的回文数各有90个,以此类推。
给出n,可以先判定一下第n个回文数的位数,然后后面也不难推,但是有很多细节需要注意。
代码君
规律就是一位和两位的回文数各有9个,三位四位的回文数各有90个,以此类推。
给出n,可以先判定一下第n个回文数的位数,然后后面也不难推,但是有很多细节需要注意。
#include <cstdio> #include <algorithm> #include <cassert> using namespace std; typedef long long LL; const int maxl = 20; LL a[maxl + 1], sum[maxl + 1], pow10[maxl]; int main() { //freopen("in.txt", "r", stdin); pow10[0] = 1; for(int i = 1; i <= 10; i++) pow10[i] = pow10[i - 1] * 10; a[1] = 9; for(int i = 2; i <= maxl; i++) { if(i % 2 == 0) a[i] = a[i - 1]; else a[i] = a[i-1] * 10; } for(int i = 1; i <= maxl; i++) sum[i] = sum[i - 1] + a[i]; //for(int i = 1; i <= maxl; i++) printf("%lld\n", sum[i]); int n; while(scanf("%d", &n) == 1 && n) { n--; int digits = upper_bound(sum+1, sum+1+maxl, n) - sum; //printf("%d\n", digits); int f = (digits - 1) / 2; //自由元的个数 LL x = n - sum[digits - 1]; LL t = x / pow10[f] + 1; //最高位数字 assert(t < 10); LL l = x % pow10[f]; char s[20]; s[0] = t + '0'; if(f) { for(int i = f; i > 0; i--) { s[i] = l % 10 + '0'; l /= 10; } assert(l == 0); } for(int i = f+1; i < digits; i++) s[i] = s[digits-1-i]; s[digits] = 0; printf("%s\n", s); } return 0; }
代码君
相关文章推荐
- UVaLIve 2889 | LA 2889 | UVa 12050 - Palindrome Numbers (组合数学)
- LA 2889 回文(找规律)
- Palindrome Numbers UVALive - 2889
- UVa11582 - Colossal Fibonacci Numbersl (打表找规律)
- 树状数组 + 位运算 LA 4013 A Sequence of Numbers
- Codeforces 638A:Home Numbers(规律)
- hackerrank Lucky Numbers(扩展gcd/规律)
- HDU——1058Humble Numbers(找规律)
- POJ - 2042 - Palindrome Numbers
- hdu 5505 GT and numbers(数学规律)
- Colossal Fibonacci Numbers! UVA - 11582 (数论,幂求模,规律周期)
- POJ 2402 Palindrome Numbers
- [ACM_数学] LA 3708 Graveyard [墓地雕塑 圈上新加点 找规律]
- HDU 4365——Palindrome graph——————【规律+快速幂】
- LA 4851 Restaurant 找规律 -
- Sum of first K even-length Palindrome numbers
- Copy List with Random Pointer & Add Two Numbers & Valid Palindrome
- LA 3357 (递推 找规律) Pinary
- Palindrome Numbers
- Leetcode: Palindrome Numbers