【蓝桥杯】 跑步锻炼

题目描述:
小蓝每天都锻炼身体。正常情况下,小蓝每天跑 1 千米。如果某天是周一或者月初(1 日),为了激励自己,小蓝要跑 2 千米。如果同时是周一或月初,小蓝也是跑 2 千米。小蓝跑步已经坚持了很长时间,从 2000 年 1 月 1 日周六(含)到 2020 年 10 月 1 日周四(含)。请问这段时间小蓝总共跑步多少千米?

思路解析
① 计算2000年1月1日到2020年10月1日一共多少天,每天正常1千米,共跑了多少千米。
② 用Arraylist保存星期一是在第几天出现,一共出现多少次。
③ 用ArrayList保存每月的1日在第几天出现,一共出现多少次。
④ 统计星期一和每月1日同时出现的天数,一共出现多少次。
⑤ 每天都正常跑1千米,然后加上每周一多跑的1千米和每月1日多跑的1千米,减去既是周一又是月初重复跑的1千米。

答案为8879

程序代码:

import java.util.ArrayList;

public class Main{

    public static void main(String[] args) {
        
        // 1.计算2000年1月1日到2020年10月1日一共count天,每天1千米,共跑了count千米
        int count = 0;
        for (int year = 2000; year <= 2020; year++) {
            if (isLeap(year)) {// 闰年
                count = count + 366;
            } else {// 平年
                count = count + 365;
            }
        }
        count = count -(30+30+31);//需要减去2020年10月、11月、12月的天数
        
        //2.用Arraylist保存星期一是在第几天出现,一共出现mondy_cnt次
        int mondy_cnt = 0;
        ArrayList<Integer> list = new ArrayList<Integer>();
        for (int i = 3; i <= count; i = i + 7) {//i=3是因为第1天星期六,所以第3天是星期一
            list.add(i);
            mondy_cnt++;
        }
        
        //3.用ArrayList保存每月的1日在第几天出现,一共出现one_cnt次。
        int start = 1;
        int[] run_days = {31,29,31,30,31,30,31,31,30,31,30,31};
        int[] ping_days = {31,28,31,30,31,30,31,31,30,31,30,31};
        ArrayList<Integer> one_list = new ArrayList<Integer>();
        int one_cnt = 1;
        for(int year = 2000;year <= 2020;year++) {
            if(isLeap(year)) {
                for(int i = 0;i<run_days.length && start < count;i++) {
                    one_list.add(start+run_days[i]);
                    one_cnt++;
                    start = start + run_days[i];
                }
            } else {
                for(int i = 0;i<ping_days.length && start < count;i++) {
                    one_list.add(start+ping_days[i]);
                    one_cnt++;
                    start = start + ping_days[i];
                }
            }
        }
        
        //4.统计星期一和每月1日同时出现的天数,一共出现cnt次
        int cnt = 0;
        for (Integer integer : one_list) {
            if(list.contains(integer)) {
                cnt++;
            }
        }
        
        //5.每天都跑1km,然后加上每周一多跑的1km和每月1日多跑的1km,减去既是周一又是月初重复跑的1km
        System.out.println(count + mondy_cnt + one_cnt - cnt);

    }

    // 判断是否为闰年
    public static boolean isLeap(int year) {
        if (year % 400 == 0 || year % 4 == 0 && year % 100 != 0) {// 闰年
            return true;
        }
        return false;
    }
}

你可能感兴趣的:(蓝桥杯,蓝桥杯,java)