【编程之美】题目1 : 2月29日

source:http://hihocoder.com/contest/msbop2015qual/problem/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
#include <iostream>
#include <string>
#include <vector>
#include <cstring>
#include <cstdlib>
//#include <fstream>
using namespace std;

#define SIZE 48499516
//vector<int> vec;
string month[] ={"January", "February", "March", "April", "May", "June", "July", "August",
        "September", "October", "November" , "December"};
int *vec;
inline bool isLeapYear(int year){
    if(year % 100 == 0){
        if(year % 400 == 0)
            return true;
    }else if(year % 4 == 0)
        return true;
    return false;
}

int str2month(string m){
    for(int i = 0; i < 12; i++)
        if(m == month[i])
            return i+1;
    return 0;
}
void init(){
    vec = (int *) malloc(SIZE * sizeof(int));
    int cnt = 0;
    for(int i = 2000; i <= 200000000; i++)
        if(isLeapYear(i)){
            vec[cnt] = i;
            cnt++;
        }
}

int leapyearbefore(int year){
    int cnt = 0;
    for(int i = 0; i < SIZE; ++i){
        //cout << vec[i] <<endl;
        if(year >= vec[i])
            cnt++;
        else
            break;
    }
    return cnt;
}
int main(){
    init();
    int T,year1,day1,year2,day2;
    char tmp,t;
    string month1,month2;
    int ans = 0;
    //ifstream cin("1.txt");
    while(cin>>T){
        for(int i = 0; i < T; i++){
            int m1,m2;
            cin>>month1>>day1>>tmp>>year1>>month2>>day2>>tmp>>year2;
            m1 = str2month(month1);
            m2 = str2month(month2);
            ans = leapyearbefore(year2) - leapyearbefore(year1);

            if(isLeapYear(year1)){
                if(m1<=2)
                    ans += 1;
            }
            if(isLeapYear(year2)){
                if((m2==2&&day2<29)||m2==1)
                    ans -=1 ;
            }
            cout << "Case #" << (i+1) << ": " << ans <<endl;
            ans = 0;
        }
    }
    free(vec);
    return 0;
}

 

posted @ 2015-04-19 19:51  neuzxy  阅读(336)  评论(0编辑  收藏  举报