您的位置:首页 > 其它

LA 2889 (找规律) Palindrome Numbers

2015-03-22 22:27 381 查看
输出第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;
}


代码君
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: