前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >2015年编程之美(资格赛) ---2月29日

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

作者头像
Gxjun
发布2018-03-26 16:50:02
7630
发布2018-03-26 16:50:02
举报
文章被收录于专栏:mlml

时间限制:2000ms

单点时限:1000ms

内存限制:256MB

描述

给定两个日期,计算这两个日期之间有多少个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

样例输入

代码语言:javascript
复制
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

样例输出

代码语言:javascript
复制
Case #1: 1
Case #2: 0
Case #3: 1
Case #4: 3


这道题,过小数据再简单不过了,但是要过大数据的话,还是有一点考验人的:
  我们这里只需要注意这几点就可以做了:
      如何求任意一个时间段的闰年数?
        方法有很多,但是要说到高效率的话,用这个还是不错的, year/4 -year/100 +year/400 ;
     但是由于还是要找到最近的闰年年份才能算简化这道题、代码如下
代码:
代码语言:javascript
复制
  1 //#define _CRT_SECURE_NO_WARNINGS
  2 //#define LOCAL
  3 
  4 #include<iostream>
  5 #include<string>
  6 #include<stdio.h>
  7 #include<stdlib.h>
  8 #include<string.h>
  9 #include<algorithm>
 10 
 11 #define __int int
 12 
 13 
 14 
 15 using namespace std;
 16 
 17 const char  month[13][15] = {
 18 
 19     "$$$","January", "February",
 20     "March", "April", "May",
 21     "June", "July", "August",
 22     "September", "October",
 23     "November", "December"
 24 };
 25 
 26 struct Mydate {
 27 
 28     __int year;
 29     char month[15];
 30     int mon;
 31     int day;
 32 
 33 };
 34 
 35 //判断是否是闰年
 36 bool isprimer(__int year) {
 37 
 38     if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))
 39         return true;        //闰年
 40     return false;            //不是闰年
 41 }
 42 
 43 //输入接口
 44 void input(Mydate & ins) {
 45 
 46     ins.mon = 0;  //初始化
 47     scanf("%s %d,%d", &ins.month, &ins.day, &ins.year);
 48 }
 49 
 50 //将月份转化为数字部分
 51 void change(Mydate  &aa) {
 52 
 53     for (int i = 1; i < 13; i++) {
 54         if (strcmp(month[i], aa.month) == 0) {
 55             aa.mon = i;
 56             return;
 57         }
 58     }
 59 }
 60 
 61 //计算年份与年份间有多少个闰年
 62 __int work(const Mydate &star, const Mydate &_end) {
 63 
 64     //找到开始年份最近的一个闰年
 65     __int fir_pr = -1, las_pr = -1, res = 0;
 66     __int num_start, num_end;
 67     for (__int var = star.year ; var <= _end.year ; var++) {
 68         if (isprimer(var)) {
 69             fir_pr = var;
 70             break;
 71         }
 72     }
 73 
 74     for (__int var = _end.year; var >= star.year; var--) {
 75         if (isprimer(var)) {
 76             las_pr = var;
 77             break;
 78         }
 79     }
 80 
 81     if (fir_pr >=star.year && las_pr>=star.year ) {
 82 
 83         num_start = (fir_pr / 4 -  fir_pr / 100 + fir_pr / 400);
 84         num_end = (las_pr / 4 - las_pr / 100 +  las_pr / 400);
 85         
 86         res =(num_end - num_start )+1;    //年份间的闰年数
 87 
 88         if ( fir_pr == star.year ) {
 89             if (star.mon > 2)  res-- ;
 90         }
 91 
 92         if ( las_pr == _end.year ) {
 93             if (_end.mon < 2 ||(_end.mon == 2 && _end.day <29) ) res-- ;
 94         }
 95     }
 96     return res;
 97 }
 98 
 99 int main() {
100 
101     Mydate _start, _end;
102     int _case, cnt = 1;
103 #ifdef LOCAL
104     freopen("test.in", "r", stdin);
105 #endif
106     scanf("%d", &_case);
107     //输入部分
108     for (cnt = 1; cnt <= _case; cnt++) {
109 
110         input(_start), input(_end);
111         change(_start), change(_end);
112         __int res = work(_start, _end);
113         printf("Case #%d: %d\n", cnt, res);
114 
115     }
116 
117 
118     return 0;
119 }
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2015-04-17 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 描述
  • 输入
  • 输出
  • 数据范围
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档