2013年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;
    }
}

运行答案

答案

菜鸡一只,欢迎各位提出意见!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值