iT邦幫忙

0

python閏年計算

  • 分享至 

  • xImage

小弟剛開始學程式,剛剛在看網路上大家講解閏年的計算時,發現大家在計算閏年時都會先從4開始除起。
例如:
https://ithelp.ithome.com.tw/upload/images/20220604/201495880azb4zfnwV.png

然而,我自己在最開始想到的解決方法為從400開始檢查起,因為我認為如果可被400整除,即符合其他條件
程式如下:
https://ithelp.ithome.com.tw/upload/images/20220604/201495885PwJRSWdwW.png

想請教一下,這樣的解法是否有誤?

http://www.mathland.idv.tw/life/leapyear.htm
這篇把緣由寫得很詳細
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
3
wiseguy
iT邦超人 1 級 ‧ 2022-06-05 12:04:04
最佳解答

你的問題牽涉到兩個資訊科系要學的學科:集合論、演算法。
就數學觀點來說,邏輯推演會從最大集合開始,逐步排除不符條件的子集。這是【集合論】要學的。
所以你會看到幾乎所有例子都是從 %4 開始推算,因為符合 %4=0 的集合,會比符合 %100=0 的集合來得大。
當然你也可以把符合條件的子集,一個一個加總起來。只是這個思維較容易遺漏。
而且化為電腦程式時,還要考慮一個問題:哪一種方式,效率比較好。這是【演算法】要學的。
也就是因為符合 %4=0 的集合,會比符合 %100=0 的集合來得大,就機率上來看,%4=0 會比 %100=0 更早結束這個閏年判斷,所以效率比較好。也就會把這個判斷擺在前面。

30381884 iT邦新手 5 級 ‧ 2022-06-06 15:33:53 檢舉

了解!
原來是因為這個原因,大家才都從4開始檢查起。謝謝解惑!

0
小魚
iT邦大師 1 級 ‧ 2022-06-05 07:18:24
  1. 貼程式碼最好貼文字, 上下用三個```包起來, 對看的人而言會比較方便
  2. 最好的驗證方式就是寫測試, 每個例子都寫幾個數字來測試, 看看是不是跟自己想的一樣
  3. 初步看起來沒問題, 程式也不是只有一種寫法, 不管黑貓白貓, 能抓老鼠就是好貓, 當然進階的還要考慮記憶體等等的, 不過這種小程式也吃不了多少記憶體, 可以忽略.
30381884 iT邦新手 5 級 ‧ 2022-06-06 15:32:23 檢舉

了解,原來是要用'''來解決空格消失的問題。
我一開始也是貼文字,但因為空格全部消失,只好改貼圖片

小魚 iT邦大師 1 級 ‧ 2022-06-07 20:43:50 檢舉

是左上方的`(加Shift會變~的那個)

0
一級屠豬士
iT邦大師 1 級 ‧ 2022-06-05 08:59:58
import calendar as cal

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]
xlist2 = [(x, cal.isleap(x)) for x in ylist]
print(xlist == xlist2)

ylist = [y for y in range(1,3000)]
xlist = [(x, isLeapYear(x)) for x in ylist]
xlist2 = [(x, cal.isleap(x)) for x in ylist]
print(xlist == xlist2)

你也可以把你寫的函數,一起檢查驗證.

30381884 iT邦新手 5 級 ‧ 2022-06-06 15:32:45 檢舉

謝謝~

1
海綿寶寶
iT邦大神 1 級 ‧ 2022-06-05 10:10:01

我不是回答
只是剛好最近看到一篇用閏年當例子的文章「閱讀程式」
提供參考

30381884 iT邦新手 5 級 ‧ 2022-06-06 15:32:55 檢舉

謝謝!

剛也在想說要找這篇文章 XD

0
akajoke
iT邦新手 5 級 ‧ 2023-01-07 20:24:15

提出一個很有趣的討論呢

簡單來說 如果你想要大海撈針
找到一萬個人裡面符合條件為:「會背26個字母 也會7000單 然後多益900 能演莎士比亞」

最好的篩選法
不是列出「符合所有條件」的人
而是第一關就問:你會不會背出26字母? 不會就直接踢掉 下一個人了

下一關又問7000單能不能背出來 又可以刷掉一批人

以上為個人想法提供參考:))

我要發表回答

立即登入回答