思路:先计算判断出这个数字有几位
1位,2位:均为9个
3位,4位:均为90个
5位,6位:均为900个
算出位数N后,K减去之前的总和,即-9-9-90-90-900……,得到新K
把N的前半段单独看,即K表示的值大致等于前半段数字,注意要把K减去1,再把首位变成1.
#include <iostream>
#include <queue>
#include <cmath>
#include <stack>
using namespace std;
typedef long long ll;
ll k;
ll ans[20];
int main ()
{
cin>>k;
k++; //依据题意,实际上算的是第k+1个
ll sum=0;
ll weishu=0;
for (ll i=1;i<=18;i++){
int temp=9;
int tn=(i-1)/2;
for (ll j=1;j<=tn;j++){
temp*=10;
}
sum+=temp;
if (sum>=k){
weishu=i;
sum-=temp;
k-=sum; //得到当前值
break;
}
}
//k值即为当前从位数为 weishu开始的第几个回文数
sum=k;
sum+=(int)pow(10,(weishu-1)/2); //首位不能为0,默认从1开始
sum--; //第一个数是0,所以减去1
stack<int>s;
while (sum){
ll t=sum%10;
sum/=10;
s.push(t);
}
int idx=0;
while (s.size()){
ll t=s.top();
s.pop();
idx++;
ans[idx]=t;
}
for (int i=weishu;i>=(weishu-idx+1);i--) //后半部分对称
{
ans[i]=ans[weishu-i+1];
}
for (int i=1;i<=weishu;i++)
{
cout<<ans[i];
}
return 0;
}