翻出以前 C
的課本
是先判斷能被 4 整除 但不能被 100 整除
後再考慮其他的能不能被 400 整除
而你的寫法
year % 4 ==0 and (year % 100 !=0 or year % 400==0)
先排除不能被 4 整除的
再進一步判斷能被 4 整除的卻不被 100 整除
或者能被 4 整除也能被 400 整除
感覺上有點不太一樣, 又好像一樣
(1801-2400間的閏年似乎都能被4整除)
印象中應該是這樣
year = int(input())
if (year % 4 ==0 and year % 100 !=0) or year % 400==0:
print('It is a leap year')
else:
print('It is not a leap year')
在https://snakify.org/en/lessons/if_then_else_conditions/problems/leap_year/ 刷到這題
基本上
if year % 4 ==0 and (year % 100 !=0 or year % 400==0):
的確是不太對的。
因為這樣子寫的話。會變成除於4會是必要條件。
但實際上閏年的計算方式。第一優先是只要能除400就算。所以除於400的要先當必要條件
也就是 y%400==0
再來才是能除於4但不能除於100。當條件。
所以就是(y%4==0 and y%100!=0)
區分出來這兩個條件後,只要其中一項有達到。就可以算是閏年。
整合起來就如下
y%400==0 or (y%4==0 and y%100!=0)
而原本的寫法
year%4 ==0 and (year % 100 !=0 or year % 400==0)
認真來說看起來結果好像是一樣的
但如果就依數學論來說。並不是完全正確的。
只是剛好能整除400的值。其實也是可以整除4。所以才會造成一樣的結果。
就程式而言結果是一樣。就數學而言算是大大的錯誤。
所以說。原本的寫法雖然結果是相同。但其實並不能說你是對的。
希望能明白我說的意思。因為在邏輯來說。像這種條件剛好可以雙向認証的機率不大。
但不能保証可不會在其它地方發生問題的。
並不是全部都寫在一行比較簡潔...
我還是喜歡
if(){
if(){
if()
...
}
}
這種感覺QQ
https://ithelp.ithome.com.tw/articles/10214650
之前剛好有寫一個. 另外有使用 calendar 模組,協助驗證.
def isLeapYear(n):
year = int(n)
return (year % 400 == 0) or ((year % 100 != 0) and (year % 4 == 0))
ylist = [2000, 1999, 2001, 2004, 1900]
xlist = [(x, isLeapYear(x)) for x in ylist]
import calendar as cal
xlist2 = [(x, cal.isleap(x)) for x in ylist]
>>> print(xlist)
[(2000, True), (1999, False), (2001, False), (2004, True), (1900, False)]
>>> print(xlist2)
[(2000, True), (1999, False), (2001, False), (2004, True), (1900, False)]