题目描述
世纪末的星期
曾有邪教称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年前的题目无法使用
优点:快速,可节省时间
-
输入日期,设置单元格格式,类型为日期
-
将B1类型改成aaaa,在B1输入=A1
-
确认后在A2输入2099/12/31
-
选中A1与A2后下拉可得以以100年为周期递增
-
将B1下拉
可得到2299年
新手创作学习,有错误欢迎指点,谢谢!