ACM 第十一届 河南省省赛A题 计划日

一、题目描述如下:

二、思路分析

  其实这个如果是一个填空题,可以直接用Excel快速计算出来,反而用代码比较麻烦

说一下我的代码的思路:

1.如果N大于本月剩下的天数,就先从N天里减去本月剩下的天数,

2.如果剩下的N天大于本年剩下的天数,就从N天里减去本年剩下的天数,这时候日期为YYYY+1年 1月 1日

3.因为闰年每四年一次,可以从N里面减去k个365*3+366天,直到N小于365*3+366,这时日期为YYYY+1+k年 1月 1日

4.从N里面减去t个当前年的天数(平年为365,闰年为366),直到N小于当前年的天数,这时候日期为YYYY+1+k+t年 1月 1日

5.从N里面减去p个月的天数,直到剩下的N不够本月的天数,这时候就能得到最后的日期为YYYY+1+k+t年 p月 N日

6.星期很好算,直接用(W+N)%7就能得到最后的星期

三、根据思路,Java代码如下(如有其他思路,恭请各位大佬评论区评论,我觉得我的思路太麻烦

import java.util.Scanner;
public class Main1 {
    static Scanner sc = new Scanner(System.in);
    static int j = sc.nextInt();
    static String str;
    static int year,month,day,w,N,m,monthDay;
    static int temp = 366+365*3;
    public static void main(String[] args) {
        for (int i = 0; i < j; i++) {
            str = sc.next();
            year = Integer.parseInt(str.substring(0, 4));
            month = Integer.parseInt(str.substring(4,6));
            day = Integer.parseInt(str.substring(6,8));
            w =sc.nextInt();
            N = (int) sc.nextLong();
            m = (int) (N/temp);
            w = (w+N)%7;//6.星期很好算,直接用(W+N)%7就能得到最后的星期
            days();//1.如果N大于本月剩下的天数,就先从N天里减去本月剩下的天数,
            months();//2.如果剩下的N天大于本年剩下的天数,就从N天里减去本年剩下的天数,这时候日期为YYYY+1年 1月 1日
            years();//3.因为闰年每四年一次,可以从N里面减去k个365*3+366天,直到N小于365*3+366,这时日期为YYYY+1+k年 1月 1日
            year();//4.从N里面减去t个当前年的天数(平年为365,闰年为366),直到N小于当前年的天数,这时候日期为YYYY+1+k+t年 1月 1日
            months();//5.从N里面减去p个月的天数,直到剩下的N不够本月的天数,这时候就能得到最后的日期为YYYY+1+k+t年 p月 N日
            System.out.println(year+""+String.format("%02d", month)+""+String.format("%02d", day)+" "+w);
        }
        
    }
    
    //从N里面减去本月剩下的天数
    static void days(){
        monthDay = getdays(year,month);
        if(day+N>monthDay){
            N=N+day-monthDay-1;
            day=1;
            month++;
        }else{
            day+=N;
            N=0;
        }
    }
    
    //从N里面减去p月的天数,直到N小于本月天数或者月数大于12
    static void months(){
        monthDay = getdays(year,month);
        while(month<=12 && N>=monthDay){
            if(N==0){
                break;
            }else{
                month++;
                day=1;
                
                if(N>=monthDay)
                    N-=monthDay;
                else{
                    day=N;
                    break;
                }
            }
        }
        if(month==13){
            month=1;
            year++;
        }else{
            day+=N;
            N=0;
        }
            
        
    }
    
    //从N里面减去k个四年
    static void years(){
        while(N>temp){
            year+=4;
            N-=temp;
        }
    }
    
    //从N里面减去当前年的天数,直到N小于当前年的天数
    static void year(){
        int nowyear = getYear(year);
        while(N>=nowyear){
            year++;
            N-=nowyear;
            nowyear = getYear(year);
        }
    }
    
    //判断是否是闰年
    static boolean jugeYear(int year){
        if(year %4==0&&year%100!=0 || year%400==0)
            return true;
        return false;
    }
    
    //获取当前年的天数
    static int getYear(int year){
        int nowyear = 365;
        if(jugeYear(year))
            nowyear = 366;
        return nowyear;
    }
    
    //获取当前月的天数
    static int getdays(int year,int month){
        if(month==1 || month==3 || month==5 || month==7 || month==8 || month==10 || month==12)
            return 31;
        else if(month==4 || month==6 || month==9 || month==11 )
            return 30;
        else{
            if(jugeYear(year))
                return 29;
            else
                return 28;
        }
    } 
}

猜你喜欢

转载自www.cnblogs.com/l199616j/p/10776706.html
今日推荐