时不时0分,时不时10分,20分,30分,,,

P3612 [USACO17JAN] Secret Cow Code S

代码练习生 @ 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 位整数)吧。一般的编译器的 intlong 都是 32 位。


by 代码练习生 @ 2020-07-19 16:56:23

@zwuis 不用吧,,,我用long也能过啊,,,long是32位吗?怪不得看到好多题解都是long long,,,我还以为是128位,,,


by zwuis @ 2020-07-19 18:53:21

@代码练习生 我好像搞错了。洛谷的 ide 中 longlong long 一样是 64 位。题目评测机应该也是这样。


by justinjia @ 2021-02-10 20:40:32

@代码练习生 没有128位整数。(除了某些神仙编译器提供的__int128除外)


|