KangPeng @ 2023-09-20 12:45:13
#include<iostream>
#include<cstdio>
#include<string>
#include<cmath>
using namespace std;
unsigned long long getNum(int len,unsigned long long N){
if(N<=len-1 && N>=0)
return N;
int p=0;
unsigned long long temp=len*pow(2,p+1)-1;
while(temp<N)
{
++p;
temp=len*pow(2,p+1)-1;
}
if(N==len*pow(2,p))//由最后一个字母旋转而来
--N;
else
N=N-len*pow(2,p)-1; //对应到旋转之前的字母
getNum(len,N);
}
int main(){
string s;
unsigned long long N;
cin>>s;
scanf("%lld",&N);
printf("%c",s[getNum(s.length(),N-1)]);//N-1是将第N个字母变为索引
return 0;
}
我的思路是不断去找前一次旋转前字母的索引.感谢大佬
by milk2715093695 @ 2023-12-25 22:18:27
时隔好几个月的回复(笑)
这是因为pow函数返回 double 类型导致的精度丢失,建议自己写一个返回值是 long long 类型的乘方函数