zoukankan      html  css  js  c++  java
  • 2015年编程之美(资格赛) ---2月29日

    时间限制: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

    样例输入
    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


    这道题,过小数据再简单不过了,但是要过大数据的话,还是有一点考验人的:
    我们这里只需要注意这几点就可以做了:
    如何求任意一个时间段的闰年数?
    方法有很多,但是要说到高效率的话,用这个还是不错的, year/4 -year/100 +year/400 ;
    但是由于还是要找到最近的闰年年份才能算简化这道题、代码如下
    代码:
      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
    ", cnt, res);
    114 
    115     }
    116 
    117 
    118     return 0;
    119 }

    截图:

    
    
    
     
  • 相关阅读:
    get the default proxy by Powershell
    import-module in $profile
    Basic Queries (LINQ to XML)
    xpath中双斜杠的作用// double slash
    Powershell 常见问题
    touch all contents in a folder recursively
    What's the difference between HEAD, working tree and index, in Git?
    beyond compare 比较文本 standard alignment VS unaligned
    bat文件中调用传参的问题
    bacth参数说明 cmd parameter
  • 原文地址:https://www.cnblogs.com/gongxijun/p/4433920.html
Copyright © 2011-2022 走看看