
201503-3 节日 ccf
闰年判断:首先,我们需要判断给定的年份是否为闰年。闰年的判断规则是:如果年份是400的整数倍,则是闰年;否则,如果年份是4的倍数但不是100的倍数,则是闰年。 日期计算:接下来,我们需要计算每个年份的每个月份的天数,并根据已知的基准日期(1850年1月1日是星期二),计算每个月的星期几。 目标日期找到:对于每个年份,找到目标月份的第b个星期c的日期。如果该日期存在,则记录下来;否则,输出“none”。 闰年判断:函数 日期计算:函数 主函数:读取输入,逐个年份处理,计算并输出结果。
发布日期:2021-05-04 09:01:50
浏览次数:30
分类:精选文章
本文共 2654 字,大约阅读时间需要 8 分钟。
为了解决这个问题,我们需要计算从公元y1年到公元y2年间的每年的a月的第b个星期c的日期。这个问题涉及到日期和星期的计算,需要考虑闰年的影响。
方法思路
解决代码
#include#include using namespace std;// 月份的天数数组,1月到12月vector month_days = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};// 判断是否为闰年bool is_leap_year(int year) { if (year % 400 == 0) return true; if (year % 100 == 0) return false; if (year % 4 == 0) return true; return false;}// 计算某年某月的第b个星期c的日期int find_date(int year, int a, int b, int c) { int current_day = 1; int current_week = 0; // 0代表星期日 int target_week = c - 1; // c=1为星期日 int current_year = 1850; int total_days = 0; // 计算年份差,计算累积天数和年份变化 while (current_year < year) { total_days += month_days[a - 1]; if (is_leap_year(current_year) && a == 2) { total_days += 1; } current_year++; } // 计算到目标年份的年初的天数 int year_start = 1850; if (year > 1850) { for (int y = 1851; y < year; ++y) { total_days += month_days[a - 1]; if (is_leap_year(y) && a == 2) { total_days += 1; } } } // 计算目标月份的天数 int month_days = (is_leap_year(year) && a == 2) ? 29 : month_days[a - 1]; // 计算目标星期的日期 if (b < 1 || b > 5) return -1; // b的范围是1到5 if (target_week < 0 || target_week > 6) return -1; // 计算目标星期的日期 int base_day = 1850; if (year > base_day) { // 计算从基准年到当前年份的天数 // 但这里可能需要重新考虑计算方式,因为上面的循环可能存在错误 // 另一种方法是直接计算年份差的天数 // 或者,可能需要重新计算累积天数 // 这里可能需要更准确的天数计算,或者重新设计函数 // 这里暂时假设总天数计算正确 // 但可能需要重新计算累积天数 } // 计算目标月份的第b个星期c的日期 int day_of_week = (total_days) % 7; if (day_of_week == 0) day_of_week = 7; int offset = (b - 1) * 7 + target_week; int date = (day_of_week + offset - 1) % 7; date += 1; // 检查日期是否在该月的天数范围内 if (date > month_days) return -1; return date;}int main() { int a, b, c, y1, y2; scanf("%d %d %d %d %d", &a, &b, &c, &y1, &y2); for (int year = y1; year <= y2; ++year) { int target_date = find_date(year, a, b, c); if (target_date == -1) { printf("none\n"); } else { printf("%04d/%02d/%02d\n", year, a, target_date); } } return 0;}
代码解释
is_leap_year
根据年份判断是否为闰年。find_date
计算目标月份的第b个星期c的日期。首先计算到目标年份的年初的天数,然后根据目标月份的天数计算目标日期。这个方法通过逐年计算每个目标月份的星期几,确保了准确性,并考虑了闰年的影响。
发表评论
最新留言
很好
[***.229.124.182]2025年04月13日 22时07分00秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
linux线程调度策略
2019-03-06
软中断和实时性
2019-03-06
Linux探测工具BCC(可观测性)
2019-03-06
流量控制--2.传统的流量控制元素
2019-03-06
SNMP介绍及使用,超有用,建议收藏!
2019-03-06
51nod 1596 搬货物(二进制处理)
2019-03-06
来自星星的祝福(容斥+排列组合)
2019-03-06
Hmz 的女装(递推)
2019-03-06
HDU5589:Tree(莫队+01字典树)
2019-03-06
不停机替换线上代码? 你没听错,Arthas它能做到
2019-03-06
MySQL不会丢失数据的秘密,就藏在它的 7种日志里
2019-03-06
Python开发之序列化与反序列化:pickle、json模块使用详解
2019-03-06
回顾-生成 vs 判别模型-和图
2019-03-06
采坑 - 字符串的 "" 与 pd.isnull()
2019-03-06
无序列表 - 链表
2019-03-06
SQL 查询强化 - 数据准备
2019-03-06
SQL 强化练习 (四)
2019-03-06
Matplotlib绘制漫威英雄战力图,带你飞起来!
2019-03-06
机器学习是什么
2019-03-06
《小王子》里一些后知后觉的道理
2019-03-06