蓝桥杯杯赛-日期模拟

知识点

处理日期

1. 按天枚举日期:逐天遍历起始日期到结束日期范围内的每个日期。

2. 处理闰年:正确判断闰年条件。闰年定义为:年份 满足以下任意一个条件:(闰年的2月只有29天)

满足下面一个条件就是闰年

1> 是 400 的倍数。

2> 是 4的倍数但不是 100的倍数

艺术与篮球

已知当前是星期几求出某个月的某一天是星期几

int week=x;x为第一天的日期

week = week%7+1求出每个星期的下一天

题目链接

1.艺术与篮球 - 蓝桥云课

题目解析

判断笔画数是不是超过50,超过50就去练习书法

算法原理

使用哈希表,把笔画和对应的数字联系在一起

使用日期函数来标记时间的开始和结尾,然后遍历每一天去计算笔画数

代码编写

import java.time.LocalDate;
import java.util.HashMap;
import java.util.Map;

public class Main {
    public static void main(String[] args) {
        Map<Character, Integer> map = new HashMap<Character, Integer>() {{
            put('0', 13);  // 零
            put('1', 1);   // 一
            put('2', 2);   // 二
            put('3', 3);   // 三
            put('4', 5);   // 四
            put('5', 4);   // 五
            put('6', 4);   // 六
            put('7', 2);   // 七
            put('8', 2);   // 八
            put('9', 2);   // 九
        }};

        LocalDate startDate = LocalDate.of(2000, 1, 1);
        LocalDate endDate = LocalDate.of(2024, 4, 14);
        int days = 0;

        while (startDate.isBefore(endDate)) {
            String s = startDate.toString().replace("-", "");
            int total = 0;

            // 通过map查询笔画数
            for (char c : s.toCharArray()) {
                total += map.get(c);
            }

            if (total > 50) {
               days++;
            }
            startDate = startDate.plusDays(1);
        }

        System.out.println(days);
    }
}

从哪开始从哪结束

LocalDate startDate = LocalDate.of(2000, 1, 1);

LocalDate endDate = LocalDate.of(2024, 4, 14);

while 循环会一直执行,直到 startDate 等于或超过 endDate。循环会逐日增加 startDate,并计算当天日期的数字笔画数。

startDate.isBefore(endDate)

转为Srting类型,并且去除-

 startDate.toString().replace("-", "");

自增天数

  startDate = startDate.plusDays(1);

补充: 获得xxx年xxx月xx日是星期几

可以使用

LocalDate date = LocalDate.of(2026, 4, 1); // 获取星期几(英文)

String weekday = date.getDayOfWeek().getDisplayName(TextStyle.FULL, Locale.ENGLISH);

另一种写法

 //造一个hash表,里面对应笔画数
        int[] hash = {13, 1, 2, 3, 5, 4, 4, 2, 2, 2};
        //month里面放每月的个数
        int[] months = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
        //计算打篮球的天数
        int count = 0;
        boolean feb = true;
        for (int year = 2000; year <= 2024; year++) {
            //笔画数
            int num = 0;
            //判断是平年还是润年
            //计算2月的值
            months[2] = isLeapYear(year) ? 29 : 28;
            //计算每一月,每一天
            for (int month = 1; month <= 12; month++) {
                for (int day = 1; day < months[month]; day++) {
                    //计算年的每一位
                    int ypos1 = year / 1000;
                    year = year % 1000;
                    int ypos2 = year / 100;
                    year = year % 100;
                    int ypos3 = year / 10;
                    year = year % 10;
                    int ypos4 = year;
                    //计算月的每一位
                    int mpos1 = month / 10;
                    month = month % 10;
                    int mpos2 = month;
                    //计算每一天的每一位
                    int dpos1 = day / 10;
                    day = day % 10;
                    int dpos2 = day;
                    //计算笔画数
                    num = hash[ypos1] + hash[ypos2] + hash[ypos3] + hash[ypos4] +
                            hash[mpos1] + hash[mpos2] + hash[dpos1] + hash[dpos2];
                    //最后计算天数
                    if (num > 50) {
                        count++;
                    }
                    if (year == 2024 && month == 4 && day == 13) {
                        System.out.println(count);
                        return;

                    }
                }
            }
        }

    }
    public static void main(String[] args) {
        cal();

    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值