你好呀,我是灰小猿,一个超会写bug的程序猿!
欢迎大家关注我的专栏“每日蓝桥”,该专栏的主要作用是和大家分享近几年蓝桥杯省赛及决赛等真题,解析其中存在的算法思想、数据结构等内容,帮助大家学习到更多的知识和技术!
标题:世纪末的星期
曾有邪教称1999年的12月31日是世界末日,当然该谣言已经不攻自破,
还有人称今后的某个世纪末的12月31日,如果是星期一则会...
有趣的是,任何一个世纪末的年份的12月31日都不可能是星期一!!
于是,“谣言制造商”又改为星期日,
1999年的12月31日是星期五,请问,未来哪一个离我们最近的一个世纪末年(即xx99年)的12月31日正好是星期天(即星期日)?
请回答该年份,(只要这个4位整数,不要写12月31等多余信息)
解题思路:
计算本题有两种方法:
第一种是常规思路:我们可以计算出每一个世纪有多少天(注意判断闰年),然后根据1999年12月31日是星期五这一条信息将之后每个世纪的最后一天是星期几给推算出来,知道推出最近的一个最后一天是星期日即可,
第二种方法是使用Java中的日期API(calender)来计算每个世纪的最后一天是星期几。
关于这两种方法的详细解答可以看下面的源码
答案源码:
第一种(常规思路)
package 一三年省赛真题; import java.util.Calendar; public class Year2013_Bt1 { public static void main(String[] args) { // 闰年366天 平年365天 // int year = 2000; int centuryDay=0; //一个世纪的天数 int week=5; //世纪末的最后一天是星期几 for (int year=2000; ; year++) { if (year%100==0) { centuryDay = 0; //如果是本世纪第一年 天数清零 } centuryDay += isRunNian(year); //如果是本世纪最后一年 if ((year+1)%100==0) { int y = centuryDay%7; week += y; //算出最后一天是星期几 if (week%7==0) { System.out.println(year); break; } } } } // 判断是不是闰年 public static int isRunNian(int year) { if ((year%4==0&&year%100!=0)||(year%400==0)) { return 366; //是闰年返回366天 }else { return 365; //不是闰年返回365天 } } }
第二种(借助calender)
package 一三年省赛真题; import java.util.Calendar; public class Year2013_Bt1 { public static void main(String[] args) { Calendar calendar = Calendar.getInstance(); //建立一个日历 for (int year = 1999; ; year+=100) { calendar.set(Calendar.YEAR, year); //设置一个年份 calendar.set(Calendar.MARCH, 11); //设置月份 calendar.set(Calendar.DAY_OF_MONTH, 31); //根据月份设置天 /** * 判断这一天是周日,周日是第一天,所以等于1 */ if (calendar.get(Calendar.DAY_OF_WEEK)==1) { System.out.println(year); break; } } } }
输出样例: