关闭

hihocoder:#1148 : 2月29日

319人阅读 评论(1) 收藏 举报
分类:

描述

给定两个日期,计算这两个日期之间有多少个2月29日(包括起始日期)。

只有闰年有2月29日,满足以下一个条件的年份为闰年:

1. 年份能被4整除但不能被100整除

2. 年份能被400整除

输入

第一行为一个整数T,表示数据组数。

之后每组数据包含两行。每一行格式为"month day, year",表示一个日期。month为{"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November" , "December"}中的一个字符串。day与year为两个数字。

数据保证给定的日期合法且第一个日期早于或等于第二个日期。

输出

对于每组数据输出一行,形如"Case #X: Y"。X为数据组数,从1开始,Y为答案。

数据范围

1 ≤ T ≤ 550

小数据:

2000 ≤ year ≤ 3000

大数据:

2000 ≤ year ≤ 2×109

样例输入
4
January 12, 2012
March 19, 2012
August 12, 2899
August 12, 2901
August 12, 2000
August 12, 2005
February 29, 2004
February 29, 2012
样例输出
Case #1: 1
Case #2: 0
Case #3: 1

Case #4: 3


下面是我的python 代码:提交一直提示WA(wrong answer),但试了很多组,并没有发现错误,求大神们指出:

#-*-coding:utf-8-*-

import copy


def judge_before(temp_day1,temp_day2,month,days):

    if(temp_day1[2] < temp_day2[2]):
        return True
    else:
        if(temp_day1[2] == temp_day2[2]):
            if(month.index(temp_day1[0]) < month.index(temp_day2[0])):
                return True
            else:
                if(month.index(temp_day1[0]) == month.index(temp_day2[0])):
                    if(int(temp_day1[1]) <= temp_day2[1]):
                        return True
                    else:
                        return False
                else:
                    return False
        else:
            return False
        
#year1_list after year2_list
def judge_after(year1_list,year2_list,month,days):
    if(year1_list[2]>year2_list[2]):
        return True
    else:
        if(year1_list[2]==year2_list[2]):
            if(month.index(year1_list[0])>month.index(year2_list[0])):
                return True
            else:
                if(month.index(year1_list[0])==month.index(year2_list[0])):
                    if(int(year1_list[1])>int(year2_list[1])):
                        return True
                    else:
                        return False
                else:
                    return False
        else:
            return False
        
    return 
        
def count_leapyear(year1_list,year2_list,month,days):
    
    count = 0

    
    year_start = year1_list[2]
    year_end = year2_list[2]
    year_judge = []
    year_judge.append('February')
    year_judge.append('29')
    
    if((year_start == year_end) and((year_start %4 == 0 and year_start%100 != 0) or (year_start %400 ==0))):
        year_judge.append(year_start)
        if(judge_before(year1_list, year_judge, month, days)):
            count = 1
            return count
        else:
            return 0
 

    for i in range(year_start+1,year_end):
        if((i%4 == 0 and i%100 != 0) or (i%400 == 0)):
            count += 1
    
    if((year_start %4 == 0 and year_start%100 != 0) or (year_start %400 ==0)):
        year_judge.append(year1_list[2])
            
        if (judge_before(year1_list, year_judge, month, days)):
            count += 1
            

    if((year_end %4 == 0 and year_end%100 != 0) or (year_end %400 ==0)):
        if(len(year_judge)==3):
            year_judge.pop()
            year_judge.append(year2_list[2])
        else:
            year_judge.append(year2_list[2])
               
        if(judge_after(year2_list, year_judge, month, days)):
            count += 1
            
    return count     


def legal_year(year_list,month,days,big_year):
    if(year_list[2]>=2000 and year_list[2]<=big_year):
        if((year_list[2]%4 == 0 and year_list[2]%100!=0)or(year_list[2]%400==0)):
            if(year_list[0]=='February'):
                if(int(year_list[1])<=29):
                    return True
                else:
                    return False
            else:
                if(year_list[0] not in month):
                    return False
                else:
                    if(int(year_list[1])<=days[month.index(year_list[0])]):
                        return True
                    else:
                        return False
        else:
            if(year_list[0] not in month):
                    return False
            else:
                if(int(year_list[1])<=days[month.index(year_list[0])]):
                    return True
                else:
                    return False
            
    else:
        return False
    
def split_day(year1,year2):
    
    year1_list = []
    year2_list = []
    temp_list = []
    
    
    temp_list = copy.deepcopy(year1.split(','))
    temp = temp_list[0].split()
    temp.append(int(temp_list[1]))
    year1_list = copy.deepcopy(temp)
    
    temp_list = copy.deepcopy(year2.split(','))
    temp = temp_list[0].split()
    temp.append(int(temp_list[1]))
    year2_list = copy.deepcopy(temp)
    
    return year1_list,year2_list 
     
if __name__ == '__main__':
    
    month = ['January','February','March','April','May','June','July','August','September','October','November','December']
    days = [31,28,31,30,31,30,31,31,30,31,30,31]

    
    num = int(raw_input())
    
    if(num>=1 and num<=550):
       
        for i in range(num):
            year1 = raw_input()
            year2 = raw_input()
            
            year1_list,year2_list = split_day(year1, year2)
            
            
            
            if((legal_year(year1_list, month, days, 3000))and (legal_year(year2_list, month, days, 2000000000))):
                if (judge_before(year1_list, year2_list,month,days)):
                    print 'Case #%i: %i' % (i+1,count_leapyear(year1_list, year2_list, month, days))
                else:
                    break 
            else:
                break       

    
    


0
0
查看评论

hihocoder:#1148 : 2月29日,python版本

计算到某年为止的闰年数,其实很简单.设要计算的年为A,则到A年为止(含A年)的闰年数为: 闰年数=INT(A/4)-INT(A/100)+INT(A/400) 这里:INT为取整数函数 #-*-coding:utf-8-*- ''' @author : liuhuiting ...
  • xiaofeilongisme
  • xiaofeilongisme
  • 2016-09-01 10:16
  • 328

hiho1148 编程之美

感受: for循环一定要好好考虑,有数学公式的别一个一个试。参考了别人的答案才ac。自己的一直超时!!! count=(nian2/4-nian2/100+nian2/400)-(nian1/4-nian1/100+nian1/400);这个公式,怪怪的。如果先(年2-年1)就会出错 #incl...
  • i_iphone
  • i_iphone
  • 2016-05-17 21:51
  • 297

2015-4-17,编程之美-hihoCoder-2月29日解答

描述 给定两个日期,计算这两个日期之间有多少个2月29日(包括起始日期)。只有闰年有2月29日,满足以下一个条件的年份为闰年: 年份能被4整除但不能被100整除 年份能被400整除 输入 第一行为一个整数T,表示数据组数。之后每组数据包含两行。每一行格式为”month day, year”,表示...
  • sjtu_chenchen
  • sjtu_chenchen
  • 2015-04-17 21:46
  • 1301

hihoCoder 1148 2月29日

时间限制:2000ms 单点时限:1000ms 内存限制:256MB 描述 给定两个日期,计算这两个日期之间有多少个2月29日(包括起始日期)。 只有闰年有2月29日,满足以下一个条件的年份为闰年: 1. 年份能被4整除但不能被100整除 2. 年份能被400整除 输入 第...
  • badguy_gao
  • badguy_gao
  • 2017-06-05 18:04
  • 93

hihoCoder #1148 : 2月29日 题解

题目描述 时间限制:2000ms 单点时限:1000ms 内存限制:256MB 描述 给定两个日期,计算这两个日期之间有多少个2月29日(包括起始日期)。 只有闰年有2月29日,满足以下一个条件的年份为闰年: 年份能被4整除但不能被100整除 年份能被400整除 输入 第一行为一个整数...
  • baidu_31492511
  • baidu_31492511
  • 2017-07-20 17:42
  • 87

统计起始日期之间有多少个2月29日

题目:统计起始日期之间有多少个2月29。#include <iostream> #include <string>using namespace std;class Date { private: int month; int day; int yea...
  • chfe007
  • chfe007
  • 2015-04-19 23:50
  • 494

[MySQL]-->查询5天之内过生日的同事中的闰年2月29日问题的解决过程

前言: 上次写了查询5天之内过生日的同事中的跨年问题的解决过程,网址为:http://blog.csdn.net/mchdba/article/details/38952033 ,其中漏了一个闰年2月29日生日的细节问题,现在补充一下这个问题的处理过程: 5,补充闰年判断有朋友提醒,闰年2...
  • mchdba
  • mchdba
  • 2014-09-01 09:25
  • 3085

2月29日

题目1 : 2月29日 时间限制:2000ms 单点时限:1000ms 内存限制:256MB 描述 给定两个日期,计算这两个日期之间有多少个2月29日(包括起始日期)。只有闰年有2月29日,满足以下一个条件的年份为闰年: 年份能被4整除但不能被100整除 年份能被400整除 输入 第一行...
  • LT_TMNT
  • LT_TMNT
  • 2015-04-17 19:49
  • 170

2005年3月29日

今天把财务的打印头、色带架都安装好了,并且填写了第一个维修记录单,这一周看来要完全全部的记录单的补填,看来是要费点劲了。另外,学生处的打印机的打印头有三根针磨损或位置有错动,表格线的竖线成点状。团委有一次上不了网,重启就好了。现象是显示已经联接,但是就是不能全部载入页面。今天的英语课听得不错,发现我...
  • ndbird
  • ndbird
  • 2005-04-04 13:20
  • 374

2018年2月3日训练日记

要理解思想而不是代码!!! 昨天晚上的比赛。重新读了B题。然后发现当时读错题意了(1、乘积号看成和号2、输出n行,以为是一行)。今天读完了之后突然发现好水。立马敲了一遍kmp搞过了。注意的是每个单词长度len需要用strlen计算然后存起来,用length会超时。中文题居然都读错。瞬间感觉自己...
  • LSD20164388
  • LSD20164388
  • 2018-02-03 21:01
  • 74
    个人资料
    • 访问:748次
    • 积分:39
    • 等级:
    • 排名:千里之外
    • 原创:3篇
    • 转载:0篇
    • 译文:0篇
    • 评论:1条
    文章分类
    文章存档
    最新评论