zoukankan      html  css  js  c++  java
  • Hihocoder 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

    import java.util.Scanner;
    
    public class Main {
    
        static String[] month={
            "January","February","March","April","May","June","July",
                "August","September","October","November","December"
                };
        public static void main(String[] args){
            Scanner s = new Scanner(System.in);
            int a = s.nextInt();
            //要加循环读入数据,每读入一次调用一次find229
            int sum[] = new int[a];
            String[] date1 = new String[3];
            String[] date2 = new String[3];
            for(int i = 0;i<a;i++){
                for(int j =0;j<3;j++){
                    date1[j] = s.next();
                }
                for(int j =0;j<3;j++){
                    date2[j] = s.next();
                }
                sum[i] = find229(date1,date2);
            }
            for(int i = 0;i<a;i++){
                System.out.println("Case #"+(i+1)+": "+sum[i]);
            }
            s.close();
        }
        public static int find229(String[] date1,String[] date2){
            int year1 = Integer.valueOf(date1[2]);
            int year2 = Integer.valueOf(date2[2]);
            int day2 = Integer.valueOf(date2[1].split(",")[0]);
            int result = 0;
            for(int i = ((year1-1)/4+1)*4;i<=(year2/4)*4;i = i+4){//保证每个年份能被4整除 
                if(i%400 == 0){
                    //从某一个能被400整除的数开始,每400个数里面有96个能被4整除但不能被100整除的数,有一个能被400整除的数,算上尾,不算头
                    //比如400~800,则是从401~800有一个能被400整除的数,有96个能被4整除不能被100整除的数
                    result++;
                    result += (year2/400-i/400)*97;
                    //小于ed.year的最大的能被400整除的数
                    i = (year2/400)*400;
                }else if(i%100!=0){//不能被400整除时
                    result++;
                }
            }
            //考虑起止年份
            if(year1%400==0||(year1%4==0&&year1%100!=0)){
                if(!(month[0].equals(date1[0])||month[1].equals(date1[0]))){
                    result--;
                }
            }
            if(year2%400==0||(year2%4==0&&year2%100!=0)){
                if(month[0].equals(date2[0])){                
                    result--;
                }else if(month[1].equals(date2[0])&&day2<29){
                    result--;
                }
            }
            return result;
        }
    }
  • 相关阅读:
    用 Python 带你看各国 GDP 变迁
    Fluent Interface(流式接口)
    probing privatePath如何作用于ASP.NET MVC View
    Word插入htm文件导致文本域动态增加的一个问题
    Visual Studio 2013附加进程调试IE加载的ActiveX Control无效解决方法
    Ubuntu下Chrome运行Silverlight程序
    Windows Phone Bing lock screen doesn't change解决方法
    SPClaimsUtility.AuthenticateFormsUser的证书验证问题
    Web Service Client使用Microsoft WSE 2.0
    Visual Studio 2013安装Update 3启动crash的解决方法
  • 原文地址:https://www.cnblogs.com/fisherinbox/p/5284471.html
Copyright © 2011-2022 走看看