• CCF 201503-3 节日


    问题描述
      有一类节日的日期并不是固定的,而是以“a月的第b个星期c”的形式定下来的,比如说母亲节就定为每年的五月的第二个星期日。
      现在,给你abcy1, y2(1850 ≤ y1, y2 ≤ 2050),希望你输出从公元y1年到公元y2年间的每年的a月的第b个星期c的日期。
      提示:关于闰年的规则:年份是400的整数倍时是闰年,否则年份是4的倍数并且不是100的倍数时是闰年,其他年份都不是闰年。例如1900年就不是闰年,而2000年是闰年。
      为了方便你推算,已知1850年1月1日是星期二。
    输入格式
      输入包含恰好一行,有五个整数a, b, c, y1, y2。其中c=1, 2, ……, 6, 7分别表示星期一、二、……、六、日。
    输出格式
      对于y1y2之间的每一个年份,包括y1y2,按照年份从小到大的顺序输出一行。
      如果该年的a月第b个星期c确实存在,则以"yyyy/mm/dd"的格式输出,即输出四位数的年份,两位数的月份,两位数的日期,中间用斜杠“/”分隔,位数不足时前补零。
      如果该年的a月第b个星期c并不存在,则输出"none"(不包含双引号)。
    样例输入
    5 2 7 2014 2015
    样例输出
    2014/05/11
    2015/05/10
    评测用例规模与约定
      所有评测用例都满足:1 ≤ a ≤ 12,1 ≤ b ≤ 5,1 ≤ c ≤ 7,1850 ≤ y1, y2 ≤ 2050。
    import java.text.SimpleDateFormat;
    import java.util.Calendar;
    import java.util.Date;
    import java.util.GregorianCalendar;
    import java.util.Scanner;
     
    public class Main {
     
        Scanner scanner = new Scanner(System.in);
     
        public void getFestival(){
            String str = scanner.nextLine();
            String[] strs = str.split(" ");
            int a = Integer.parseInt(strs[0]);
            int b = Integer.parseInt(strs[1]);
            int c = Integer.parseInt(strs[2]);
            if(c==7)
                c=1;
            else
                c++;
            int startYear = Integer.parseInt(strs[3]);
            int endYear = Integer.parseInt(strs[4]);
            Calendar calendar = new GregorianCalendar();
            SimpleDateFormat simpleDateFormat  = new SimpleDateFormat();
            simpleDateFormat.applyPattern("yyyy/MM/dd");
            for(int i = startYear;i<=endYear;i++){
                calendar.set(Calendar.YEAR,i);
                calendar.set(Calendar.MONTH,a-1); 
                calendar.set(Calendar.DAY_OF_WEEK_IN_MONTH,b);
                calendar.set(Calendar.DAY_OF_WEEK,c);
                Date date = calendar.getTime();
                calendar.setTime(date); 
                if(calendar.get(Calendar.MONTH)!=a-1){ //如果找不到的话calendar找到的日期的月份自然和之前设置的不一样所以以此为判断条件
                    System.out.println("none");
                    continue;
                }
                String ans = simpleDateFormat.format(date);
                System.out.println(ans);
                calendar.clear();
            }
     
        }
     
        public static void main(String[] args) {
            Main main = new Main();
            main.getFestival();
        }
     
    }
    /*
    在写日期题这个方面java的Calendar类是真的厉害
    
    这里我使用的是calendar的子类GregorianCalendar即公历类
    
    这题有几个点要注意
    
    (1) Calendar类里面月份的表示是从0到11的所以,要表示a月需要将a-1
    
    (2)题目里用c=7表示周日,但是实际在西方公历里周日是一周的第一天此时c应该等于1,周六是一周的最后一天此时c应该等于7所以这里需要一个小小的判断
    
    (3)这里不能用WEEK_OF_MONTH而需要用DAY_OF_WEEK_IN_MONTH因为这题要求的是第几个周几,不是第几周的周几
    
    WEEK_OF_MONTH会返回该日在该月中是第几周,它按照真实日历来计算,而DAY_OF_WEEK_IN_MONTH是按照日期的顺序来计算和真实日历情况无关
    
    举例说明:
    
    2018年11月4日是星期日,按西方公历来算是第二周的第一天,它前面的日期都输出第一周,所以你输出该日的WEEK_OF_MONTH会返回2,但是11月4日在11月1日到11月7日之间所以它输出按日期顺序排的第一周所以你输出它的DAY_OF_WEEK_IN_MONTH是1
    */
  • 相关阅读:
    (转)Paint类的主要方法介绍
    (转)实时对讲机
    (转)Android:Layout_weight的深刻理解
    好的网址
    自定义控件模板,不用依赖属性---------------------WPF
    asyns和await实现传统的异步---------C#
    线程访问wpf的控件(与winform有差异)---------------WPF
    C#多线程之Task------------ C#
    换肤功能的实现-------------WPF
    访问嵌入的资源----图片实例-------C#
  • 原文地址:https://www.cnblogs.com/shenben/p/12363557.html
Copyright © 2020-2023  润新知