【蓝桥杯JavaB组真题详解】世纪末的星期(2013)

题目描述

世纪末的星期
曾有邪教称1999年12月31日是世界末日。当然该谣言已经不攻自破。还有人称今后的某个世纪末的12月31日,如果是星期一则会…

有趣的是,任何一个世纪末的年份的12月31日都不可能是星期一!! 于是,“谣言制造商”又修改为星期日…

1999年的12月31日是星期五,请问:未来哪一个离我们最近的一个世纪末年(即xx99年)的12月31日正好是星期天(即星期日)?

请回答该年份(只写这个4位整数,不要写12月31等多余信息)

解题思路

方法一:运用API文档中Calendar类
限制:时间在1970年前的题目无法使用

Calendar 类是一个抽象类,它为特定瞬间与一组诸如 YEAR、MONTH、DAY_OF_MONTH、HOUR 等 日历字段之间的转换提供了一些方法,并为操作日历字段(例如获得下星期的日期)提供了一些方法。瞬间可用毫秒值来表示,它是距历元(即格林威治标准时间 1970 年 1 月 1 日的 00:00:00.000,格里高利历)的偏移量。

参考代码

import java.util.Calendar;

public class Main {
     

	public static void main(String[] args) {
     
	
		Calendar calendar = Calendar.getInstance();
		for (int year = 1999; year < 10000; year += 100) {
     
			calendar.set(year, 11, 31);
			if (calendar.get(Calendar.DAY_OF_WEEK) == 1) {
      
				System.out.println(year);
				break;
			}
		}
	}
}

运行结果:2299
注意:月份中0为1月份,本题十二月份应为11;而一周中1代表星期日,以此类推。

方法二:基姆拉尔森计算公式

y:年 m:月 d:日 w:星期几 
w= (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400+1)%7 

注意:
1.w的取值范围是0,1,2,3,4,5,6,分别代表星期日,星期一,星期二,星期三,星期四,星期五,星期六。
2.今年的1、2月要换成去年的13、14月	
	eg:2020-1-1则换算成2019-13-1来代入公式计算。
3.这个公式可以直接计算出那个日期是星期几,但请注意!这类问题如果假设和真实情况不符的时候要记得换上偏移量,比如问题假设某个日期是星期一,而真实情况这天是星期二,那么我们计算出来的星期几也要-1,但请保证再1~7的环中。

参考代码

public class Main {
     

	public static void main(String[] args) {
     
		int y = 1999;
		int m = 12;
		int d = 31;
		int w;
		for(;y<10000;y+=100) {
     
			 w = (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400+1)%7;
			 if(w==0) {
     
				 System.out.println(y);
				 break;
			 }
		}
	}
}

方法三:Excel工具
限制:时间在1970年前的题目无法使用
优点:快速,可节省时间

  1. 输入日期,设置单元格格式,类型为日期
    【蓝桥杯JavaB组真题详解】世纪末的星期(2013)_第1张图片
    【蓝桥杯JavaB组真题详解】世纪末的星期(2013)_第2张图片

  2. 将B1类型改成aaaa,在B1输入=A1
    【蓝桥杯JavaB组真题详解】世纪末的星期(2013)_第3张图片
    【蓝桥杯JavaB组真题详解】世纪末的星期(2013)_第4张图片

  3. 确认后在A2输入2099/12/31

  4. 选中A1与A2后下拉可得以以100年为周期递增
    【蓝桥杯JavaB组真题详解】世纪末的星期(2013)_第5张图片

  5. 将B1下拉
    【蓝桥杯JavaB组真题详解】世纪末的星期(2013)_第6张图片
    可得到2299年

新手创作学习,有错误欢迎指点,谢谢!

你可能感兴趣的:(蓝桥杯JavaB组真题详解,算法,经验分享,java,excel)