编程之美2015第一题

来源:互联网 发布:c语言中for什么意思 编辑:程序博客网 时间:2024/04/30 12:24

描述

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



这道题由于数据量是1e9

所以用循环必死。

这里我们用到了容斥的原理,之余容斥是什么,自己去脑补,我也是学长给我讲了以后才知道的


由于我们需要(能被400整除和能被4但是不能被100整除的数),所以我们:能被4整除的数的个数+能被4整除的

-能被100整除的数的个数,这我们就算出了在年分a以前的闰年个数。


这里由于我们只关心年分,所以我在之前把年分处理了一下






#include<stdio.h>

#include<iostream>
#include<string>
#include<string.h>
#include<vector>
#include<algorithm>
#include<queue>
#include<stack>
#include<math.h>
#include<map>
//#define nn 110
#define inff 0x3fffffff
#define nn 20000007
#define maxx 2e9
#define ll long long
using namespace std;
char cc[20][10]={ "January",
                  "February",
                  "March",
                  "April",
                  "May",
                  "June",
                  "July",
                  "August",
                  "September",
                  "October",
                  "November" ,
                  "December"
                };

int main()
{
    ll day1,year1,month1;
    ll day2,year2,month2;


    ll a400,a100,a4;
    ll b400,b100,b4;


    char mo1[10],mo2[10], dian;
    ll i,j,i1;
    ll n;
    ll cntmon;
    while(scanf("%lld",&n)!=EOF)
    {
        for(i1=1;i1<=n;i1++)
        {
            cntmon=0;
            scanf("%s %lld %c %lld",mo1,&day1,&dian,&year1);
            scanf("%s %lld %c %lld",mo2,&day2,&dian,&year2);


           for(i=0;i<12;i++)
           {
               if(strcmp(mo1,cc[i])==0)
               {
                  month1=i+1;
                   break;
               }
           }
           for(i=0;i<12;i++)
           {
               if(strcmp(mo2,cc[i])==0)
               {
                   month2=i+1;
                   break;
               }
           }


          if(month1>=3)
          {
              year1++;
          }


          if(month2==2)
          {
              if(day2<29)
              {
                  year2--;
              }


          }
          else if(month2<2)
          {
              year2--;
          }
           a4=year1/4;
           a400=year1/400;
           a100=year1/100;
           b4=year2/4;
           b400=year2/400;
           b100=year2/100;
           ll g1=0,g2=0;


           ll flag1=0,flag2=0;
           if(year2%400==0||(year2%4==0&&year2%100!=0))
            flag2=1;


           if(year1%400==0||(year1%4==0&&year1%100!=0))
            flag1=1;




            if(year1==year2)
            {
                if(year2%400==0||(year2%4==0&&year2%100!=0))
                    cntmon=1;
            }
            else
            {
                if(flag1==0&&flag2==1)
                {
                     cntmon=b4+b400-b100-(a4+a400-a100);
                }
                else  if(flag1==1&&flag2==0)
                {
                         cntmon=b4+b400-b100-(a4+a400-a100)+1;


                }


                else  if(flag1==1&&flag2==1)
                {
                         cntmon=b4+b400-b100-(a4+a400-a100)+1;


                }
                 else  if(flag1==0&&flag2==0)
                {
                         cntmon=b4+b400-b100-(a4+a400-a100);


                }


            }


//printf("***  %lld %lld *****\n",year1,year2);
         ll pp=0;
         for(i=year1;i<=year2;i++)
          {
              if(i%400==0||(i%4==0&&i%100!=0))
               pp++;//
               // cntmon++;
          }


    //  cntmon=cnt[0]+cnt[1]-cnt[2];


      //     printf("&&&&&&&&  %lld\n",pp);
          printf("Case #%lld: %lld\n",i1,cntmon);
        }
    }


}





0 0
原创粉丝点击