abc363D.Palindromic Number

题意:找第k小的回文串

思路:除去0的情况下,第一位有9个回文串,第二位有9个,第三位有90个,第四位有90个

我们可以枚举回文串的长度,对于长度为d的回文串,前(d+1)/2位是从10^((d+1)/2-1)到10^((d+1)/2)-1的。所以对于每一个长度的字符串我们都可以算出当前长度的回文串数量,我们枚举每一个长度,判断我们的n是否小于等于当前长度的回文串数量,如果大于,我们就更新n,继续找下一个长度,如果小于等于,就说明我们要找的回文串长度等于当前长度d。这时,我们的n就是当前长度回文串的第几个,拼接成一个长度为d的字符串就是我们的答案,这里注意一下,如果长度是奇数,我们需要减去中间的那个字符,例如字符串应为12321,我们直接拼会变为123321。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define int long long 
ll qpow(ll a,ll p){
    ll res=1;
    while(p){
        if(p&1) (res*=a);
        (a*=a);
        p>>=1;
    }   
    return res;
}
signed main(){
    int n;cin>>n;
    if(n==1){
      cout<<"0"<<endl;//特判一下,便于后面计算
      return 0;
    }
    n--;
    for(int d=1;;d++){//枚举回文串的长度
        int x=(d+1)/2;//枚举有效位长度
        if(n<=qpow(10,x-1)*9){
            //n小于等于当前位数的回文串数量,说明n是d位的
            string t=to_string(qpow(10,x-1)+n-1);
            //看是当前位的第几个,因为是从0开始的,所以需要向前一个
            string t1=t;//存前半部分的数字
            reverse(t.begin(),t.end());//后半部分
            t1+=t;//加起来就是整个第n个回文
            if(d&1) t1.erase(x,1);//奇数的话会多加中间一位,删掉
            cout<<t1<<endl;
            break;
        }
        else{
            n-=9*qpow(10,x-1);
            //n大于当前位数的回文串数量说明位数不够
            //继续看下一位
        }
    }   
}
 

  • 9
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这段代码也可以实现在一个区间内寻找回文数并计算它们的和。 其中 `isPalindromic` 函数用于判断一个数是否为回文数,`getInputs` 函数用于获取区间的上边界和下边界,并检查用户的输入是否合法。在主程序中,我们首先调用 `getInputs` 函数获取区间的上边界和下边界,然后通过循环遍历这个区间,找到其中所有回文数,并将它们存储在一个列表中。最后,我们计算这些回文数的总和,并输出结果。 这段代码的工作流程与之前的示例代码基本相同,唯一的区别是在输入区间时,代码将上边界和下边界分别存储在 `upper` 和 `lower` 变量中,并检查它们的大小关系。如果用户输入的上边界比下边界小,则交换它们的值,以确保下边界始终小于或等于上边界。 下面是这段代码的完整实现: ```python def isPalindromic(n): s = str(n) return s == s[::-1] def getInputs(): count = 0 while count < 3: try: upper = int(input("请输入区间的上边界:")) lower = int(input("请输入区间的下边界:")) if upper > lower: upper, lower = lower, upper return upper, lower except: print("输入有误,请重新输入!") count += 1 print("输入错误次数过多,程序退出!") exit() palindromic_list = [] upper, lower = getInputs() for i in range(lower, upper + 1): if isPalindromic(i): palindromic_list.append(i) total = sum(palindromic_list) print("区间[{},{}]中的回文数为:{}".format(lower, upper, palindromic_list)) print("它们的和为:{}".format(total)) ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值