2018icpc北京Palindromes推规律

题意:

时间限制:1000ms

单点时限:1000ms

内存限制:512MB

描述

Recently, Nvoenewr learnt palindromes in his class.A palindrome is a nonnegative integer that is the same when read from left to right and when read from right to left. For example, 0, 1, 2, 11, 99, 232, 666, 998244353353442899 are palindromes, while 10, 23, 233, 1314 are not palindromes.Now, given a number, Nvoenewr can determine whether it’s a palindrome or not by using loops which his teacher has told him on the class. But he is now interested in another question: What’s the K-th palindrome? It seems that this question is too difficult for him, so now he asks you for help.Nvoenewr counts the number from small to big, like this: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 22, 33, 44, 55, 66, 77, 88, 99, 101 and so on. So the first palindrome is 0 and the eleventh palindrome is 11 itself.
Nvoenewr may ask you several questions, and the K may be very big.

输入

The first line contains one integer T(T <= 20) —— the number of questions that Nvoenewr will ask you.Each of the next T lines contains one integer K. You should find the K-th palindrome for Nvoenewr.Let’s say K is a n-digit number. It’s guaranteed that K >= 1, 1 <= n <= 100000 and the sum of n in all T questions is not greater than 1000000.

输出

Print T lines. The i-th line contains your answer of Nvoenewr’s i-th question.

样例输入

4
1
10
11
20

样例输出

0
9
11
101

​ 翻译成汉语就是问第n个回文数是多少?n的长度范围是1e5

思路:

​ 队友当时告诉我用数位dp做,然后我想了一手觉得还是找联系吧。然后发现只要处理前九位就能填满1e5的数据范围。。直到错了两发才发现,他喵的n的数据范围不是1e5,而是n的数字长度为1e5。好吧,即然这样肯定是有规律了,然后就利用之前处理的前1e9个打表找到其中的规律然后Accept(规律见代码)

代码:

#include <stdio.h>
#include <string.h>
#define N 100000

char s[N + 5];

int main () {
    int T;
    scanf("%d", &T);
    while (T --) {
        scanf("%s", s);
        int len = strlen(s);
        if (len == 1) {
            printf("%d\n", s[0] - '0' - 1);
            continue;
        }
        if(len == 2 && s[0] == '1' && s[1] == '0') {
            printf("9\n");
            continue;
        }
        if (s[0] == '1') {
            if (s[1] == '0') {
                printf("9");
                for (int i = 2; i < len; i++) {
                    printf("%c", s[i]);
                }
                for (int i = len - 2; i > 1; i--) {
                    printf("%c", s[i]);
                }
                printf("9\n");
            } else {
                for (int i = 1; i < len; i++) {
                    printf("%c", s[i]);
                }
                for (int i = len - 1; i > 0; i--) {
                    printf("%c", s[i]);
                }
                printf("\n");
            }
        } else {
            printf("%d", s[0] - '0' - 1);
            for (int i = 1; i < len; i++) {
                printf("%c", s[i]);
            }
            for (int i = len - 2; i > 0; i--) {
                printf("%c", s[i]);
            }
            printf("%d\n", s[0] - '0' - 1);
        }
    }
    return 0;
}

转载请注明出处!!!

如果有写的不对或者不全面的地方 可通过主页的联系方式进行指正,谢谢

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值