我想我可能会有一个无限循环,因为每当我运行代码时,我都会收到一条错误消息,上面写着"程序关闭了13秒。"
整个代码,应该以一个日期作为输入,并在第二天输出,该代码假设所有月份都是30天。除了daysBetweenDates
函数之外,其他一切似乎都很正常。有人有什么建议吗?或者有人能告诉我我缺了什么?
def daysInMonth(year, month):
return 30
def nextDay(year, month, day):
if day < 30:
return year, month, day + 1
else:
if month == 12:
return year + 1, 1, 1
else:
return year, month + 1, 1
return
def dateIsBefore(year1, month1, day1, year2, month2, day2):
if year1 < year2:
return True
def daysBetweenDates(year1, month1, day1, year2, month2, day2):
days = 0
while dateIsBefore(year1, month1, day1, year2, month2, day2):
days += 1
return days
def test():
test_cases = [((2012,1,1,2012,2,28), 58),
((2012,1,1,2012,3,1), 60),
((2011,6,30,2012,6,30), 366),
((2011,1,1,2012,8,8), 585 ),
((1900,1,1,1999,12,31), 36523)]
for (args, answer) in test_cases:
result = daysBetweenDates(*args)
if result != answer:
print "Test with data:", args, "failed"
print result
else:
print "Test case passed!"
test()
您的daysBetweenDates()
算法确实有一个无限循环。
while dateIsBefore(year1, month1, day1, year2, month2, day2):
days += 1
您永远不会在循环中修改任何年/月/日的值,所以如果条件为true一次,它将永远为true。
从概念上讲,解决方案是每次将day2
减少一,因此当两个日期相等时,days
将是它们之间的时差。然而,既然你说你假设每个月有30天,你就把事情搞得太复杂了。您可以通过将(年、月、日)元组转换为日值来查找两个日期之间的日差。例如,
def days_between_dates(y1, m1, d1, y2, m2, d2):
date1 = y1*360 + (m1-1)*30 + d1
date2 = y2*360 + (m2-1)*30 + d2
# assuming you want to return 0 if date2 is before date1
return date2 - date1 if date2 >= date1 else 0
此解决方案在一个月内正确计算天数,不涉及任何类型的无限循环,在闰年内计算正确的日期,并为输入提供准确的答案。该解决方案是用Python编写的。
def daysInMonth(m,y):
if m == 1 or m == 3 or m == 5 or m == 7 or m == 8 or m ==10 or m == 12:
return 31
else :
if m == 2:
if isLeapYear(y):
return 29
return 28
return 30
def nextDay(y,m,d):
if d < daysInMonth(m,y):
return y, m, d+1
else:
if m == 12:
return y + 1, 1, 1
else:
return y, m + 1, 1
def-isLeapYear(y):
if y % 400 == 0:
return True
elif y % 4 == 0:
return True
else:
if y % 100 == 0:
return False
return False
def dateIsBefore(y1,m1,d1,y2,m2,d2):
days = 0
if y1 < y2 :
return True
if y1 == y2:
if m1 < m2:
return True
if m1 == m2:
return d1<d2
return False
数据之间的定义天数(y1、m1、d1、y2、m2、d2):
days = 0
while dateIsBefore(y1, m1, d1, y2, m2, d2):
y1, m1, d1 = nextDay(y1, m1, d1)
days = days + 1
return days
def-test():
test_cases = [((2012,1,1,2012,2,28), 58),
((2012,1,1,2012,3,1), 60),
((2011,6,30,2012,6,30), 366),
((2011,1,1,2012,8,8), 585 ),
((1900,1,1,1999,12,31), 36523)]
for (args, answer) in test_cases:
result = daysbetweendates(*args)
if result != answer:
print "Test with data:", args, "failed"
print result
else:
print "Test case passed!"
test()
函数dateIsBefore
不完整。
def dateIsBefore(year1, month1, day1, year2, month2, day2):
if year1 < year2:
return True
if year1 == year2 and month1 < month2:
return True
if year1 == year2 and month1 == month2 and day1 < day2:
return True
return False
(它可以被简化,但为了清楚起见,我就这样留下了。当然,你也可以使用datetime.date
——其他人已经发表了评论;另请参阅告诉你增加第1年、第1个月和第1天的其他答案)
dateIsBefore将始终返回True。