世纪末的星期
- java B组历年蓝桥杯真题链接见该博客:蓝桥杯历年真题及详细解答
原题
题目描述
曾有邪教称1999年12月31日是世界末日。当然该谣言已经不攻自破。还有人称今后的某个世纪末的12月31日,如果是星期一则会…
有趣的是,任何一个世纪末的年份的12月31日都不可能是星期一!! 于是,“谣言制造商”又修改为星期日…1999年的12月31日是星期五,请问:未来哪一个离我们最近的一个世纪末年(即xx99年)的12月31日正好是星期天(即星期日)?
请回答该年份(只写这个4位整数,不要写12月31等多余信息)
题目分析
- 从1999年12月31日开始,每一百年为一个时长单位进行计算,总天数 - 2若能被 7 整除,则是符合题意的年份。
- 总天数 - 2的原因:1999年12月31日是星期五,总天数 - 2后,才可以保证 xx99年的12月31日是星期日。
- 可以这样理解:
(16 - 2) % 7 == 0
;而星期五 + 16天正好是星期日。
代码实现(java)
public class Test01 {
public static void main(String[] args) {
/**
* 从1999年12月31日开始,省略月份,默认月份永远是12月31日
*/
int startYear = 1999;
/**
* 总天数
*/
int sumDays = 0;
/**
* 退出循环的条件
*/
boolean isSuccess = false;
while(true) {
//先递增年份,因为1999年12月31日已经是一年的最后一天,先递增年份才可以保证在满足xx99年12月31日时,总天数不发生错误
startYear++;
if(isLeapYear(startYear)) {
sumDays += 366;
}else {
sumDays += 365;
}
//当2000年12月31日时,总天数为366天,没有发生错误。
//进行判断是否满足条件
if(String.valueOf(startYear).endsWith("99")) {
isSuccess = (sumDays - 2) % 7 == 0 ? true : false;
}
//满足条件后退出循环
if(isSuccess) {
break;
}
}
//输出
System.out.println(startYear);
}
public static boolean isLeapYear(int year) {
return year % 400 == 0 || year % 100 != 0 && year % 4 == 0;
}
}
运行答案
菜鸡一只,欢迎各位提出意见!