代码练习生 @ 2020-07-17 15:41:31
#include<stdio.h>
#include<string.h>
char s[32];
int len;
unsigned long
getNCL(unsigned long new_charLen,unsigned long N){
while(new_charLen>=N) new_charLen>>=1;
return new_charLen;
}
char
getChar(unsigned long N){
printf("%c",s[N]);
}
void
fenzhi(unsigned long new_charLen,unsigned long N){
while(1){
if(N<=len){
N=N<1?len:N;
getChar(N);
return ;
}
N=N-new_charLen-1;
new_charLen=getNCL(new_charLen,N);
}
}
int
main(){
unsigned long N,new_charLen;
scanf("%s%lu",s+1,&N);
s[0]='a'; //填入任意一个字符,以防止s[0]为\0
len=strlen(s);
new_charLen=len;
while(new_charLen<N) new_charLen<<=1; //不能等于
new_charLen>>=1;
fenzhi(new_charLen,N);
return 0;
}
by zwuis @ 2020-07-17 21:35:00
@代码练习生
字符串最长有 40 位。你的 s
数组为什么只有 32 位?
你的 len
是输入字符串的长度对吧。但是你填充了 s[0]
。算出的 len
要减 1
。
你的 N = N < 1 ? len : N;
和 N = N - new_charLen - 1;
体现了旋转中的“最后一个字符会成为新的第一个字符”。但是上述操作可能会出现多次。
by 代码练习生 @ 2020-07-18 20:36:57
@zwuis 没有,,,我按了一下f5就过了90,,,最后一个问题是出在那个N=N-new_charLen-1; 字符串最长有40位吗?
by zwuis @ 2020-07-19 16:39:23
@代码练习生
看错了,是 30 位……
你的 N
要用 long long
(64 位整数)吧。一般的编译器的 int
和 long
都是 32 位。
by 代码练习生 @ 2020-07-19 16:56:23
@zwuis 不用吧,,,我用long也能过啊,,,long是32位吗?怪不得看到好多题解都是long long,,,我还以为是128位,,,
by zwuis @ 2020-07-19 18:53:21
@代码练习生 我好像搞错了。洛谷的 ide 中 long
跟 long long
一样是 64 位。题目评测机应该也是这样。
by justinjia @ 2021-02-10 20:40:32
@代码练习生 没有__int128
除外)