最近,我正在用Hackerrank解决条件中的一个非常基本的问题。
问题是:
如果n为奇数,则打印怪异如果n为偶数且在2到5的范围内,则打印Not Weird如果n是偶数且在6到20的范围内,则打印为怪异如果n为偶数且大于20,则打印Not Weird
所以我写了下面的代码
if(n % 2 == 0 & n >=6 & n <= 20 ):
print("Weird")
elif(n % 2 == 0 & n <= 2 & n >= 5):
print("Not Weird")
elif( n % 2 != 0):
print("Weird")
else:
print("Not Weird")
起初没有用。我发现我必须使用“和”而不是“&”。但是,我不知道为什么会这样。对于n = 12,如果条件为true,则第一个条件的所有3个条件。所以true&true&true也应该是true,对吧?
this photo shows the code snippet with some print messages
我很高兴知道这种行为背后的原因,请指导! (可能是非常小的事情,但请不要介意:))
对于n = 12,如果条件为true,则第一个条件的所有3个条件。
>>> n = 12
>>> n % 2 == 0 & n >= 6 & n <= 20
False
第二个条件为假(条件不是您认为的那样,因为按位运算符与其他数字运算符[+
,-
,%
等)相似,因为它们的优先级更高比比较运算符)。
让我们分解一下:
>>> n % 2
0
>>> 0 & n
0
>>> 6 & n
4
>>> 0 == 0 >= 4 <= 20
False
由于0 & n >= 6 & n
条件,该表达式为假。 0不大于4!
我已经自定义您的代码,它可以正常工作。您可以应用此代码。
n = int(input("Enter n : "))
if(n%2 != 0):
print("Weird")
elif(n%2 == 0 and n >= 2 and n <= 5):
print("Not Weird")
elif(n%2 == 0 and n >=6 and n <= 20 ):
print("Weird")
else:
print("Not Weird")
从grammar可能不会立即显而易见,但是二进制算术运算的绑定比二进制按位运算的绑定更紧密。因此,您的比较与
相同>>> if(n % 2 == (0 & n) >= (6 & n) <= 20 ):
... print("Weird")
...
>>>
您的“真实与真实&true”案例是
>>> if((n % 2 == 0) & (n >=6) & (n <= 20) ):
... print('Weird')
...
Weird
但是那只行,因为python True
和False
的计算结果为1
和0
。由于这种基础表示,按位操作才有效。