题面描述
求 0~n 中有多少个整数 k 满足 (2 * k) XOR (3 * k) == k, 其中 XOR 为异或操作。
输入数据
输入数据的第一行为一个正整数 T(T<=30) ,表示测试数据的组数。接下来的 T 行中,每行为一组测试数据,包含一个正整数 n(n<=1000000000) 。
输出数据
对每一组输入数据,输出一行结果 ”Case #id: M” ,表示第 id 组数据的结果是 M , id 从 1 开始。
样例输入
5
0
1
2
3
4
样例输出
Case #1: 1
Case #2: 2
Case #3: 3
Case #4: 3
Case #5: 4
心得:这个不好想,参考其他大佬代码
def getM(n):
binaryL = []
while n: # 转二进制
binaryL.append(n%2)
n = n//2
count = 0
pre = -1
while binaryL:
temp = binaryL.pop()
if temp == 1:
count += fixedL[len(binaryL)][0] + fixedL[len(binaryL)][1]
if (temp == 1 and pre == 1): # 两个1相邻则结束
break
pre = temp
return count
fixedL = [[0,0] for row in range(50)]
fixedL[0][0] = 1
for i in range(49):
fixedL[i + 1][1] += fixedL[i][0]
fixedL[i + 1][0] += fixedL[i][1] + fixedL[i][0]
T = int(input())
for t in range(T):
n = int(input())+1 # 加上0这种情况
print("Case #{}: {}".format(t+1,getM(n)))