天老了

时间:2016-04-11 17:04:04

标签: python

我在这两个案例中遇到问题print daysBetweenDates(2011, 1, 1, 2012, 8, 8) print daysBetweenDates(1900,1,1, 1999,12, 31)当我把它们与其他测试案例放在一起时,我得到了错误的答案,额外1天,有时候是2天。有时候其中一个给了我正确答案但是它也显示为Test with data:(2011, 1, 1, 2012,8,8)failed Test with data: (1900, 1, 1, 1999, 12, 31) failed,但当我单独测试每个案例时,我得到了正确答案。

daysofmonths = [ 0,31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
def leap_year(year):
    leap_day = 366
    common_day = 365
    if year % 4 != 0:
        return common_day
    elif year % 100 != 0:
        return leap_day
    elif year % 400 !=0:
        return common_day
    else:
        return leap_day
def daysBetweenDates(year1, month1, day1, year2, month2, day2):
    #code for same year
    if year1 == year2:
        if month1 == month2:
            return day2 - day1
        days = daysofmonths[month1] - day1 
        month1 = month1 + 1
        while month1 < month2: 
            if leap_year(year1) == 366:
                daysofmonths[2] = 29 
            days = days + daysofmonths[month1] 
            month1 = month1 + 1
        return days + day2
  ################################################
    days = daysofmonths[month1] - day1
    month1 = month1 + 1
    while month1 <= 12:
        if leap_year(year1) == 366:
            daysofmonths[2] = 29
        days = days  + daysofmonths[month1] 
        month1 = month1 + 1
    #print days 
    year1 = year1 + 1 
    ###########################################################
    days = days + day2 
    month2 = month2 - 1 
    while month2 >= 1:
        if leap_year(year2) == 366:
            daysofmonths[2] = 29
        days = days + daysofmonths[month2] 
        month2 = month2 - 1
    #print days
    year2 = year2 - 1 
    ###########################################################
    while year1 <= year2:
        days = days + leap_year(year1)
        year1 = year1 + 1
    return days 
print daysBetweenDates(2011, 1, 1, 2012, 8, 8)
print daysBetweenDates(1900,1,1, 1999,12, 31)

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"
        else:
            print "Test case passed!"

test()

2 个答案:

答案 0 :(得分:0)

当你这样做时:

daysofmonths[2] = 29

它会更改列表中的元素,然后用于每个后续调用,如果您在测试用例之间添加print(daysofmonths[2]),您会看到在第一个案例之后始终为29需要检查二月,所以不要有条件地改变列表:

if leap_year(year1) == 366:
    daysofmonths[2] = 29 
days = days + daysofmonths[month1] 

只是有条件地添加到days

if leap_year(year1) == 366 and month1 == 2:
    days = days + 29
else:
    days = days + daysofmonths[month1]

然后使用year2month2执行同样的操作(我强烈建议您将代码分成更多功能,因为很多功能非常重复)

答案 1 :(得分:0)

这是我在这个特定问题上找到的唯一一篇帖子,所以我想我会分享我的解决方案。

#days in the months of a non leap year
daysOfMonths = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]

#determine if a year is a leap year
def is_leap_year(year1):
    year = True
    if  year1 % 4 != 0:
        year = False
    elif year1 % 100 != 0:
        year = True
    elif year1 % 400 != 0:
        year = False
    else: year = True
    return year

#returns the days in the given month of the given year
#I was trying to do something similar to the OP until I read this post
def days_in_month(year, month):
    days = 0
    if is_leap_year(year) and month == 2:
        days += 29
    else:
        days += daysOfMonths[month - 1]
    return days

#itterates through each month starting at year1 month1
#up to but not including month2 of year2 and
#returns the total number of days in that period
def total_days(year1, month1, year2, month2):
    days = 0
    while year1 < year2 or month1 < month2:
        days += days_in_month(year1, month1)
        month1 += 1
        if month1 == 13:
            year1 += 1
            month1 = 1
    return days



def daysBetweenDates(year1, month1, day1, year2, month2, day2):

    days = total_days(year1, month1, year2, month2)
#because I included the beginning month I have to subtract day1
#because I did not include the final month I have to add day2
    return days - day1 + day2

#I used print statements here to troubleshoot
#print days_in_month(2012, 1)
#print daysBetweenDates(2012, 1, 1, 2012, 2, 28) 
#print daysBetweenDates(2012, 1, 1, 2012, 3, 1) 
#print daysBetweenDates(2011,6,30,2012,6,30) 
#print daysBetweenDates(2011,1,1,2012,8,8) 
#print daysBetweenDates(1900,1,1,1999,12,31) 


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"
        else:
            print "Test case passed!"

test()