我正在撰寫一個代碼,根據用戶輸入的日期(1583 年到 9999 年之間)為用戶提供星期幾。我的問題是閏年。閏年可以用 Zellers 同余進行數學計算:https ://en.wikipedia.org/wiki/Zeller's_congruence
您可以將公式歸結為以下陳述句:
如果年份可以被 400 整除,或者可以被 4 整除但不能被 100 整除,則為閏年。
我的代碼在這方面做得很好,除非年份在兩個 if 陳述句中都是正確的。例如:2016 年。這是閏年,這使得第一個 if 陳述句為真。但它也不能被 400 整除。這在第二個 if 陳述句中是正確的。因此,當我運行程式時,我會收到兩次“Day:”的提示。
有關如何解決此問題的任何提示?
有問題的代碼:
if (year % 400 == 0) or ((year % 4 == 0) and (year % 100 != 0)):
day = int(input("Day: "))
while day < 1 or day > 29:
print("Out of allowed range 1 to 29")
day = int(input("Day: "))
continue
if ((year % 4 != 0) and (year % 100 == 0)) or (year % 400 != 0):
day = int(input("Day: "))
while day < 1 or day > 28:
print("Out of allowed range 1 to 28")
day = int(input("Day: "))
continue
我嘗試將“或”運算子更改為“和”,但這并沒有真正做任何事情
if ((year % 4 != 0) and (year % 100 == 0)) or (year % 400 != 0):
if ((year % 4 != 0) and (year % 100 == 0)) and (year % 400 != 0):
我也嘗試過手動輸入與 2016 年類似的閏年。但這并不能真正解決我的問題。
整個代碼:
x = [1,3,5,7,8,10,12]
y = [4,6,9,11]
year = int(input("Year: "))
while year < 1583 or year > 9999:
print("Out of allowed range 1583 to 9999")
year = int(input("Year: "))
month = int(input("Month: "))
while month < 1 or month >12:
print("Out of allowed range 1 to 12")
month = int(input("Month: "))
if month in x:
day = int(input("Day: "))
while day < 1 or day > 31:
print("Out of allowed range 1 to 31")
day = int(input("Day: "))
elif month in y:
day = int(input("Day: "))
while day < 1 or day > 30:
print("Out of allowed range 1 to 30")
day = int(input("Day: "))
elif month == 2:
if (year % 400 == 0) or ((year % 4 == 0) and (year % 100 != 0)):
day = int(input("Day: "))
while day < 1 or day > 29:
print("Out of allowed range 1 to 29")
day = int(input("Day: "))
continue
if ((year % 4 != 0) and (year % 100 == 0)) or (year % 400 != 0):
day = int(input("Day: "))
while day < 1 or day > 28:
print("Out of allowed range 1 to 28")
day = int(input("Day: "))
continue
if month == 1 or month == 2:
month = 12
year -= 1
weekday = (( day 13*(month 1)//5 year year//4
- year//100 year//400 ) % 7)
print("It is a", end = ' ')
if weekday == 0:
print("Saturday")
elif weekday == 1:
print("Sunday")
elif weekday == 2:
print("Monday")
elif weekday == 3:
print("Tuesday")
elif weekday == 4:
print("Wednesday")
elif weekday == 5:
print("Thursday")
elif weekday == 6:
print("Friday")
uj5u.com熱心網友回復:
您的第一個條件if是正確的:
(year % 400 == 0) or ((year % 4 == 0) and (year % 100 != 0))
但根據德摩根定律,相反的條件是
(year % 400 != 0) and ((year % 4 != 0) or (year % 100 == 0))
所以你想用它作為你二if月份的第二個條件。
或者更清楚地說,您可以創建一個函式來確定它是否是閏年:
def is_leap_year(year):
return (year % 400 == 0) or ((year % 4 == 0) and (year % 100 != 0))
然后是二月:
if is_leap_year(year):
# Get a day between 1 and 29
else:
# Get a day between 1 and 28
uj5u.com熱心網友回復:
Python 中有很多內置模塊非常有用,其中一個是datetime模塊,它使日期計算變得更加容易。您的解決方案可以濃縮為以下代碼:
import datetime
while True:
try:
year=int(input('Year:'))
month=int(input('Month:'))
day=int(input('Day:'))
date = datetime.datetime(year,month,day)
print(date.strftime('%A'))
break
except ValueError as e:
print(e)
datetimeValueError 將具有無法從輸入引數創建 a 的原因。您仍然可以檢查其他約束,例如年份并ValueError(<your message>)在超出范圍時提高 a。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/507880.html
