/**
* 第一题:世纪末的星期
* 题目描述
* 曾有邪教称1999年12月31日是世界末日。当然该谣言已经不攻自破。
* 还有人称今后的某个世纪末的12月31日,如果是星期一则会....
* 有趣的是,任何一个世纪末的年份的12月31日都不可能是星期一!!
* 于是,“谣言制造商”又修改为星期日......
* 1999年的12月31日是星期五,请问:未来哪一个离我们最近的一个世纪末年(即xx99年)的12月31日正好是星期天(即星期日)?
* 请回答该年份(只写这个4位整数,不要写12月31等多余信息)
*/
public class Main {
public static void main(String[] args) {
System.out.println(getDoomsday());
}
/* 星期索引
例如: 1999年12月31日是 星期五, 索引初始为4 对应星期五,
那么2000年是闰年 366 % 7 == 2, 那索引往后移动2 则对应2000年12月31日为星期天
同理: 。。。。。。
那么100年呢
那么我先 判断 【2000, 2100) 年 包含2000年, 但不包含2100年, 之间有多少个闰年和平年,
用 days 将这100年有多少天累加起来, 取模 7 (一个星期刚好7天) 得到余数, 在原来的index基础上加上这个余数
从而在取余 这个星期数组长度, 防止数组下表越界, 就得到 1999年的100年后(2099年)12月31日是星期几了
只要是星期天就返回, 从而得到假象世界末日
*/
public static int getDoomsday(){
// 一周 数组
String[] week = {"星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期天"};
// 按下标取星期, 当前是1999年, 对应就是星期五
int index = 4 % week.length;
// 每100年有多少天计数器
int days = 0;
// 从1999的后一年开始, 则就是 2000年
int startYear = 1999 + 1;
// 到开始年份的后一百年, 但不包括最后一年如 2000 ---> 2100 年 包括2000 不包括2100年
int endYear = startYear + 100;
// 循环获取
while (true){
// 循环获取每一个100年有多少天
for (int i = startYear; i < endYear; i++) {
// 闰年 366天 平年 365天
if (isLeapYear(i)){
days += 366;
}else {
days += 365;
}
}
// 该方法顶部有解释
index = ((days % 7) + index) % week.length;
// 如果是星期天就返回该 世界末年, 因为上述末年是一个开区间 例如:[2000, 2100), 返回时需要减 1
if ("星期天".equals(week[index])){
return endYear - 1;
}
// 重置 天数 计数器
days = 0;
// 开始年份为 上一次的结束的 年份
startYear = endYear;
// 结束的 年份为 后推100年
endYear = startYear + 100;
}
}
// 判断是否是闰年
public static boolean isLeapYear(int year){
if (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)){
return true;
}
return false;
}
}