#18349: 介紹


rexwu1104@gmail.com (黑雪公主 Black Lotus)

學校 : 新北市私立南山高級中學
編號 : 93041
來源 : [118.166.54.130]
最後登入時間 :
2022-06-06 20:48:09
e305. Xor 運算 -- π | From: [220.141.86.69] | 發表日期 : 2019-07-05 18:16

我使用的判斷方法是

先找到在n以下(含)距離n最近的2次方

判斷n是否等於2次方

如果是,直接輸出n

否,將一個變數x設為n/2

如果n<=n+x

就直接輸出x

否,將設為n+x,x設為x/2

再判斷一次

到最後,如果x=1,就會輸出1

如果這個方法不好,請各位大神幫改。

 
#18350: Re:介紹


rexwu1104@gmail.com (黑雪公主 Black Lotus)

學校 : 新北市私立南山高級中學
編號 : 93041
來源 : [118.166.54.130]
最後登入時間 :
2022-06-06 20:48:09
e305. Xor 運算 -- π | From: [220.141.86.69] | 發表日期 : 2019-07-05 18:58

我使用的判斷方法是

先找到在n以下(含)距離n最近的2次方

判斷n是否等於2次方

如果是,直接輸出n

否,將一個變數x設為n/2

如果n<=n+x

就直接輸出x

否,將設為n+x,x設為x/2

再判斷一次

到最後,如果x=1,就會輸出1

如果這個方法不好,請各位大神幫改。

但是我過不了
這是程式碼

#import <ios>
inline long long redn() {
long long ret=0; char ch=getchar_unlocked();
if(ch == EOF) return -1;
while (ch>='0'&&ch<='9') ret=ret*10+ch-'0', ch=getchar_unlocked();
return ret;
}
inline void wrtn(long long x) {
long long y=10, len=1;
if (x<0) putchar_unlocked('-'), x=~x+1;
while(y<=x) y*=10, len++;
while(len--) y/=10, putchar_unlocked(x/y+48), x%=y;
putchar_unlocked(10);
}
long long down_2(long long x) {
long down=1;
while (down<=x) {
down<<=1;
}
return down>>1;
}
int main() {
long long a;
for (;(a=redn())!=-1;) {
long long ans, down;
down=down_2(a), ans=down>>1;
if (down==a) wrtn(a);
else {
while (down+ans<a) {
down+=ans, ans>>=1;
if (down+1==a) break;
}
wrtn(ans);
}
}
return 0;
}
 
ZeroJudge Forum