2013年蓝桥杯B组省赛--世纪末的星期(JAVA)


/**
 * 第一题:世纪末的星期
 * 题目描述
 * 曾有邪教称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;
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值