1.问题叙述
中国有句俗语叫“三天打鱼两天晒网”。某人从1990年1月1日起便开始“三天打鱼两天晒网”,问这个人在以后的某一天中是“打鱼”还是“晒网”。
2.解决方案
根据题意可以将解题过程分为以下三步:
1)计算从1990年1月1日开始至指定日期共有多少天。
2)由于“打鱼”和“晒网”的周期为5天,所以将计算出的天数用5去除。
3)根据余数判断他是在“打鱼”还是在“晒网”。若余数为1,2,3,则他是在“打鱼”,否则是在“晒网”。
使用的算法为数值计算算法,要利用循环求出指定日期距1990年1月1日的天数,并考虑到循环过程中的闰年情况,闰年二月为29天,平年二月为28天。
判断闰年的方法可以用伪语句描述如下:如果能被4整除并且不能被100整除或者能被400整除,则该年是闰年,否则不是闰年。
3.代码演示
#三天打鱼两天晒网
print("please input 指定日期 包括年,月,日 如:1999 1 31")
year,month,day=[int(i) for i in input().split()]
#判断是否为闰年,是,返回1;否则返回0
def runYear(year):
if (year%4==0 and year%100!=0) or (year%400==0):
return 1
else:
return 0
def countDay(currentDay):
#每月天数数组
perMonth=[0,31,28,31,30,31,30,31,31,30,31,30]
totalDay=0
year=1990
while year<currentDay['year']:
#求出指定日期之前的每一年的天数之和
if runYear(year)==1:
totalDay+=366
else:
totalDay+=365
year+=1
#如果为闰年,则二月份为29天
if runYear(currentDay['year'])==1:
perMonth[2]+=1
i=0
while i<currentDay['month']:
#将本年内的天数累加道totalDay中
totalDay+=perMonth[i]
i+=1
totalDay+=currentDay['day']
return totalDay
#定义一个日期字典
today={'year':year,'month':month,'day':day}
totalDay=countDay(today)
print("%d年%d月%d日与1990年1月1日相差 %2d天"%(year,month,day,totalDay))
result=totalDay%5
if result>0 and result<4:
print("今天打鱼")
else:
print("今天晒网")
4.结果展示