day12 1341十三号星期五(打表、模拟)

该博客探讨了在给定年份范围内每个月13号是星期五的频率,并提供了一个程序来模拟并计算这一概率。通过遍历年份、月份,考虑闰年的条件,博主展示了如何使用编程解决日期和星期之间的关系问题。输出结果展示了一年内每个月13号出现各天数的统计情况。

1341. 十三号星期五

十三号星期五真的很不常见吗?

每个月的十三号是星期五的频率是否比一周中的其他几天低?

请编写一个程序,计算 NNN 年内每个月的 131313 号是星期日,星期一,星期二,星期三,星期四,星期五和星期六的频率。

测试的时间段将会开始于 190019001900111111 日,结束于 1900+N−11900+N−11900+N1121212313131日。

一些有助于你解题的额外信息:

  1. 190019001900111111 日是星期一。
  2. 在一年中,444 月、666 月、999 月、111111 月每个月 303030 天,222 月平年 282828 天,闰年 292929 天,其他月份每个月313131天。
  3. 公历年份是444 的倍数且不是 100100100 的倍数的年份为闰年,例如 199219921992 年是闰年,199019901990 年不是闰年。
  4. 公历年份是整百数并且是 400400400 的倍数的也是闰年,例如170017001700年,180018001800年,190019001900年,210021002100年不是闰年,200020002000年是闰年。

输入格式
共一行,包含一个整数 NNN

输出格式
共一行,包含七个整数,整数之间用一个空格隔开,依次表示星期六,星期日,星期一,星期二,星期三,星期四,星期五在十三号出现的次数。

数据范围
1≤N≤4001≤N≤4001N400
输入样例:

20

输出样例:

36 33 34 33 35 35 34

思路:

本题看着很难,要考虑的事情很多,其实想明白了的话,就是一个简单的打表模拟题。

打表是一种典型的用空间换时间的技巧,一般指将所有可能需要用到的结果事先计算出来,这样后面需要用到时就可以直接查表获得。

步骤:

  1. 先枚举年,在枚举月
  2. 看一年的12个月中,13号落在周几
  3. 如果是闰年,2月天数+ 1
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        //打表列出每月的天数,为了让月份和数组的索引对应,这里让数组长度是13,第一个元素设为0
        int[] months = {0,31,28,31,30,31,30,31,31,30,31,30,31};
        int[] weekdays = new int[7];//记录每月十三号是周几的数组

        int days = 0;//记录当前离1990年1月1号已经过了多少天
        for(int year = 1900;year < 1900 + n;year++){
            for(int j = 1; j <= 12;j++){
                //开始就是1号,所以加12就是13号,然后模7便是当前13号是星期几
                weekdays[(days + 12) % 7]++;
                days += months[j];
                if(j == 2){//如果是闰年,则二月要多加上一天
                    if((year % 4 == 0 && year % 100 != 0) || (year % 400 ==0)){
                        days++;
                    }
                }
            }
        }
        //输出周六至周五的数量
        for(int i = 5,j = 0; j < 7;i = (i + 1) % 7,j++){
            System.out.print(weekdays[i] + " ");
        }
    }
}

在这里插入图片描述

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值