我只是想解决this problem on Codeforces:检查是否可以将数字w(1≤w≤100)分解为2个偶数之和
我解决了问题,并开始寻找其他解决方案。我找到了解决方法:
w=int(input())
print("YNEOS"[(w%2)|(w<=2)::2])
花了一半的时间来解决问题,然后才解决。不幸的是,我没有得到它的工作方式以及为什么它比我的快。我的解决方法是:
n = int(input())
if (n-2)%2==0 and n > 2:
print("YES")
else:
print("NO")
我是python的初学者。因此,如果我得到正确的解释,这对我将非常有帮助。
答案 0 :(得分:0)
::
部分称为slicing。通用语法为start:stop[:step]
,它将从原始索引中创建一个新的数组或字符串,从索引start
到 before stop
,每step
(默认= 1)。它实际上是slice(start, stop, step)
的语法糖,它返回slice object。如果省略stop
,则将提取到字符串末尾的所有元素
您可能需要阅读An Informal Introduction to Python以获得有关切片的更多信息
现在(w%2)|(w<=2)
计算开始索引。 |
是bitwise-OR operator。 w<=2
是布尔表达式,但在Python "Booleans are a subtype of integers"中,因此True和False分别转换为1和0
w % 2 == 1
。无论剩下的部分如何,在这种情况下,(w%2)|(w<=2)
都将始终为1,并且表达式变为"YNEOS"[1::2]
,该表达式将占用从索引1开始的字符串中的第二个字母。结果是字符串NO
w % 2 == 0
。根据问题描述1 ≤ w ≤ 100
,唯一有效的偶数属于[2,100]范围
w == 2
,则w <= 2
返回1,输出为NO
,如上w > 2
,则(w%2)|(w<=2)
的两面均为0,而"YNEOS"[0::2]
则采用第一个,第三个和第5个字母,即YES
意识到表达式总是返回0或1,我们将有一个更易读的解决方案,它使用直接寻址而不是切片
w=int(input())
print(['YES', 'NO'][(w % 2) | (w <= 2)])
顺便说一句,您有一个多余的减法:(n-2)%2==0
与n % 2 == 0
完全相同