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

本文介绍了一种算法,用于计算两个给定日期之间(包括起始日期)的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;
}

 

转载于:https://www.cnblogs.com/zxy1992/p/4439725.html

您可能感兴趣的与本文相关的镜像

Seed-Coder-8B-Base

Seed-Coder-8B-Base

文本生成
Seed-Coder

Seed-Coder是一个功能强大、透明、参数高效的 8B 级开源代码模型系列,包括基础变体、指导变体和推理变体,由字节团队开源

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值