统计闰年2月29日天数

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

2.问题分析

这个问题难度不大,但需要处理的细节比较多。读完题后,第一思路就是计算起始时间和终止时间之间有多少个闰年,然后在判断边界条件。按照这个思路解题,实现起来需要处理的细节不较多 。

为了使问题更加简单,我们可以找一个公共的“起始时间”,比如0年0月0日(ST)。然后分别计算出题目给出的两个时间与ST之间有多少个2月29日,两者的差就是所求问题的解。有一个细节就是,题目给出的第一个时间如果是闰年2月29日,作差后需要加1.

3.代码

  1 #include <iostream>
  2 #include <vector>
  3 #include <string>
  4 #include <cmath>
  5 #include <map>
  6 #include <fstream>
  7 using namespace std;
  8
  9 string firstmonth,secondmonth;
 10 int firstday,secondday;
 11 int firstyear,secondyear;
 12 map<string,int> myMonth;
 13
 14 int total(string month,int day,int year);
 15 bool isIncludeRun(string month,int day,int year);
 16 int main()
 17 {
 18     int T;
 19     int i,j;
 20     myMonth.insert(pair<string,int>("January",1));
 21     myMonth.insert(pair<string,int>("February",2));
 22     myMonth.insert(pair<string,int>("March",3));
 23     myMonth.insert(pair<string,int>("April",4));
 24     myMonth.insert(pair<string,int>("May",5));
 25     myMonth.insert(pair<string,int>("June",6));
 26     myMonth.insert(pair<string,int>("July",7));
 27     myMonth.insert(pair<string,int>("August",8));
 28     myMonth.insert(pair<string,int>("September",9));
 29     myMonth.insert(pair<string,int>("October",10));
 30     myMonth.insert(pair<string,int>("November",11));
 31     myMonth.insert(pair<string,int>("December",12));
 32     cin >> T;
 33     char c1,c2;
 34     int count1,count2,count;
 35     for (i=1;i<=T;i++)
 36     {
 37         cin >> firstmonth >> firstday>>c1 >> firstyear>>secondmonth >> secondday >>c2>> secondyear;
 38         count1 = total(firstmonth,firstday,firstyear);
 39         count2 = total(secondmonth,secondday,secondyear);
 40         count = count2 - count1;
 41         if (isIncludeRun(firstmonth,firstday,firstyear))//判断第一个时间是不是闰年的2.29
 42         {
 43             count++;
 44         }
 45         cout<< "Case #"<<i<<": " <<count<<endl;
 46         //rs.push_back(run());
 47     }
 48
 49
 50     return 0;
 51 }
 52
 53 int total(string month,int day,int year)
 54 {
 55     int res=0;
 56     res +=(year/4-year/100+year/400);//这里统计有多少个闰年时,其实是计算0.0.0到year这年的最后一天12.31之间的闰年天数
 57     if (0 == year%400)
 58     {
 59         int temp =(myMonth.find(month))->second;
 60         if ((temp == 2 && day==29)||temp>2)
 61         {
 62         }
 63         else
 64             res--;
 65     }
 66
 67     if (0 != year%100 && 0==year%4)
 68     {
 69         int temp =(myMonth.find(month))->second;
 70         if ((temp == 2 && day==29)||temp>2)
 71         {
 72         }
 73         else
 74             res--;
 75     }
 76     return res;
 77 }
 78
 79 bool isIncludeRun(string month,int day,int year)
 80 {
 81     if (0 == year%400)
 82     {
 83         int temp =(myMonth.find(month))->second;
 84         if ((temp == 2 && day==29))
 85         {
 86             return true;
 87         }
 88     }
 89
 90     if (0 != year%100 && 0==year%4)
 91     {
 92         int temp =(myMonth.find(month))->second;
 93         if ((temp == 2 && day==29))
 94         {
 95             return true;
 96         }
 97     }
 98
 99     return false;
100 }

ok。

时间: 2024-10-20 21:45:47

统计闰年2月29日天数的相关文章

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

前言: 上次写了查询5天之内过生日的同事中的跨年问题的解决过程,网址为:http://blog.csdn.net/mchdba/article/details/38952033 ,居康甩脂机怎么样其中漏了一个闰年2月29日生日的细节问题,现在补充一下这个问题的处理过程: 5,补充闰年判断 有朋友提醒,闰年2月29日生日的话,可能查询不到,想到确实没有考虑到这个特殊的日期.5.1,准备测试数据SQL,包含1980-02-29这一天生日的朋友.INSERT INTO ali_users  SELEC

SQL点滴6—“微软不认识闰年2月29日”&amp;字符&quot;N&quot;的作用

原文:SQL点滴6-"微软不认识闰年2月29日"&字符"N"的作用 http://www.cnbeta.com/articles/50580.htm这个网页新闻中报告许多微软软件不能识别闰年的2月29号 ,其中就包含SQL Server 2008,本人就在自己的SQL Server 2008中写了几个语句试验,这几个语句显示能得到2月29号这一天,不知道照这则新闻所说在这一天安装软件会不会导致错误. select DATEADD(DD,1,'28/Feb/2

2015编程之美 2月29日(求闰年的个数)

<span style="font-size:14px;">// 描述 // 给定两个日期,计算这两个日期之间有多少个2月29日(包括起始日期). // 只有闰年有2月29日,满足以下一个条件的年份为闰年: // 1. 年份能被4整除但不能被100整除 // 2. 年份能被400整除 // 输入 // 第一行为一个整数T,表示数据组数. // 之后每组数据包含两行.每一行格式为"month day, year",表示一个日期.month为{"J

2月29日(编程之美2015资格赛)

时间限制:2000ms 单点时限:1000ms 内存限制:256MB 描述 给定两个日期,计算这两个日期之间有多少个2月29日(包括起始日期). 只有闰年有2月29日,满足以下一个条件的年份为闰年: 1. 年份能被4整除但不能被100整除 2. 年份能被400整除 输入 第一行为一个整数T,表示数据组数. 之后每组数据包含两行.每一行格式为"month day, year",表示一个日期.month为{"January", "February",

计算两日期间2月29日总数的Java程序

事先声明,本人仅仅是个计算机领域的新手,不久前开始学习Java.后来我接到了一份关于计算两日期间2月29日总数的编程作业,仓促之中我便写下了这个程序.由于之前可以说毫无编程经验,Java也仅仅是只学了一小部分.所以目前该程序尚未解决输入问题. 我解决这个问题的思路是: 编写一个方法(leapYear)用于判断某一年份是否为闰年: 编写另一个方法(dateExist)用于判断某一时期是否真实存在,在这方法中会引用到上个方法: 最后编写main方法,引用方法(dateExist)分别判断起始日期和终

hihoCoder 1148 2月29日

时间限制:2000ms 单点时限:1000ms 内存限制:256MB 描述 给定两个日期,计算这两个日期之间有多少个2月29日(包括起始日期). 只有闰年有2月29日,满足以下一个条件的年份为闰年: 1. 年份能被4整除但不能被100整除 2. 年份能被400整除 输入 第一行为一个整数T,表示数据组数. 之后每组数据包含两行.每一行格式为"month day, year",表示一个日期.month为{"January", "February",

2月29日

我自己写的代码测试论坛上的数据都通过的,但是就是通不过OJ,应该是超时,给大家提供一种思路吧. 时间限制:2000ms 单点时限:1000ms 内存限制:256MB 描述 给定两个日期,计算这两个日期之间有多少个2月29日(包括起始日期). 只有闰年有2月29日,满足以下一个条件的年份为闰年: 年份能被4整除但不能被100整除 年份能被400整除 输入 第一行为一个整数T,表示数据组数. 之后每组数据包含两行.每一行格式为"month day, year",表示一个日期.month为{

c实现:2月29日

时间限制:2000ms 单点时限:1000ms 内存限制:256MB 描述 给定两个日期,计算这两个日期之间有多少个2月29日(包括起始日期). 只有闰年有2月29日,满足以下一个条件的年份为闰年: 1. 年份能被4整除但不能被100整除 2. 年份能被400整除 输入 第一行为一个整数T,表示数据组数. 之后每组数据包含两行.每一行格式为"month day, year",表示一个日期.month为{"January", "February",

西安OpenParty11月29日活动高清图文回顾——新增西安APEC蓝美图!

本次活动由西安OpenParty负责线下活动组织运营,线上由InfoQ-QClub.OSChina协办. OSChina活动召集帖:运维为王--应用系统.DevOps与Docker(11月29日) Info-QClub活动召集帖:QClub西安:运维为王--应用系统.DevOps与Docker(11月29日) 报名人数统计: 总报名121人,过滤掉无效数据实际报名115人 报名来源通过:InfoQ网站宣传.金数据报名链接.OSChina报名页面三种途径. 报名参与人数比较集中的西安公司 (参加本