小w的进制转换

小w的进制转换

可以把原数先转换为二进制

然后对于前半部分,后半部分就是前半部分取反后逆序的结果

然后分两种情况讨论一下就行了

官方题解比我说的不知道高明到哪里去了

code:

#include<bits/stdc++.h>
#define int long long
using namespace std;
int t, n;
int check(int len){
	int x = 0, ans = (n >> (len >> 1));
	x = ans << (len >> 1);
	for(int i = 1; i <= (len >> 1); i ++){
		if(!((1ll << (i - 1)) & ans)) x |= (1ll << (len / 2 - i));
	}	
	if(x <= n) return ans;
	return ans - 1;
}
signed main(){
	scanf("%d", &t);
	while(t --){
		scanf("%lld", &n);
		int bit = 0, m = n;
		for(; m; m >>= 1) bit ++;
		if(bit & 1)	printf("%lld\n", (1ll << (bit >> 1)) - 1);	
		else printf("%lld\n", check(bit));
	}	
	return 0;
}

posted @ 2019-09-28 13:26  lahlah  阅读(55)  评论(0编辑  收藏  举报