东方博弈OJ 1853:黑色星期五 ← 模拟题

​【题目来源】
https://oj.czos.cn/p/1853

【题目描述】
有些西方人比较迷信,如果某个月的 13 号正好是星期五,他们就会觉得不太吉利,用古人的说法,就是“诸事不宜”。请你编写一个程序,统计出在某个特定的年份中,出现了多少次既是 13 号又是星期五的情形,以帮助你的迷信朋友解决难题。
说明:
(1)一年有 365 天,闰年有 366 天,所谓闰年,即能被 4 整除且不能被 100 整除的年份,或是既能被 100 整除也能被 400 整除的年份;
(2)已知 1998 年 1 月 1 日是星期四,用户输入的年份肯定大于或等于 1998 年。

【输入格式】
输入只有一行,即某个特定的四位数的年份(大于或等于 1998 年)。

【输出格式】
输出只有一行,即在这一年中,出现了多少次既是 13 号又是星期五的情形。

【输入样例】
2026

【输出样例】
3

【数据范围】
年份(大于或等于 1998 年)

【算法分析】
● 设输入的年份是 x,则代码 int jan1Week=(4+totalDays)%7; 得到 x 年 1 月 1 日是星期几?其中,totalDays‌ 表示 1998 年 1 月 1 日至第 x-1 年最后一天的总天数。

博宜1853
据上图,可以容易理解上面红色代码得到的是某年元旦那天是星期几?因为1998年元旦那天作为一天参与计算了。

【算法代码】

#include <bits/stdc++.h>
using namespace std;

bool isLeap(int y) {
    return (y%4==0 && y%100!=0) || (y%400==0);
}

int main() {
    int year;
    cin>>year;
    int totalDays=0;
    for(int i=1998; i<year; i++) {
        totalDays+=isLeap(i)?366:365;
    }

    int jan1Week=(4+totalDays)%7;
    int cnt=0, daysPassed=0;
    int months[]= {0,31,28,31,30,31,30,31,31,30,31,30,31};
    if(isLeap(year)) months[2]=29;
    for(int m=1; m<=12; m++) {
        int currentWeek=(jan1Week+daysPassed)%7;
        if(currentWeek==0) cnt++;
        daysPassed+=months[m];
    }
    cout<<cnt<<endl;

    return 0;
}

/*
in:2026
out:3
*/




【参考文献】
/
 

​

posted @ 2026-11-09 20:19  Triwa  阅读(7)  评论(0)    收藏  举报