若要不使用+、-、*和%运算符检查数字是否为4的倍数,请执行以下操作。
def multipleFour(n):
if n == 1:
return False
XOR = 0
for i in range(n):
XOR = XOR ^ 1
return XOR == n
multipleFour(20)我的回答是假的
发布于 2017-11-30 01:43:34
您在中被误认为是循环以及xor语句。应该是-
def multipleFour(n):
if n == 1:
return False
XOR = 0
for i in range(1, n+1):
XOR = XOR ^ i
return XOR == n
multipleFour(20)也就是说,您的循环必须运行i=1到i=n,而不是i=0到i=n-1。一定是xor = xor ^ i
编辑:
正如在评论中指出的,for I在范围(1,n+1)不满足不使用+的条件,但只要稍加修改,这件事情就可以解决如下问题:
def multipleFour(n):
if n == 1:
return False
XOR = n
for i in range(1, n):
XOR = XOR ^ i
return XOR == n
multipleFour(20)发布于 2017-11-30 01:46:29
您的XOR以0开头,您所使用的唯一操作是XOR ^ 1;结果只能是0或1。您的代码显式地在1上返回True,并且不能在更大的数字上返回True;它应该只返回0的True。
同时,如果不使用+、-、*和%运算符,则很容易检查某物是否为4“的倍数。”,使用AND和NOT。
def multipleFour(n):
return not(n & 3)发布于 2017-11-30 01:41:54
您可以检查二进制文件,避免将所有整数从0转到n。
0 0000
1 0001
2 0010
3 0011
4 0100 8 1000 12 1100四的倍数的二进制签名是'00'。
def x_of_4(n):
return bin(n)[-2:] == '00'然而,尽管转换为字符串可以使可视化和理解变得容易,但这并不是最好的想法,而且这个方法对于n = 0失败了。
是一个更好的方法,也是这样做的:按位使用3,它将测试二进制表示的最后两个零( @ShadowRanger在注释中的学分):
def x_of_4(n):
return not n & 3https://stackoverflow.com/questions/47564531
复制相似问题