Friday the Thirteenth 黑色星期五

**Friday the Thirteenth 黑色星期五**解题思路来自NOCOW题目:13 号又是星期五是一个不寻常的日子吗?13 号在星期五比在其他日少吗?为了回答这个问题,写一个程序来计算在 n 年里 13日落在星期一,星期二…星期日的次数.这个测试从 1900 年 1 月 1 日到1900+n-1 年 12 月 31 日.n 是一个非负数且不大于 400.这里有一些你要知道的:1900 年 1 月 1 日是星期一.4,6,11 和 9 月有 30 天.其他月份除了 2 月有
摘要由CSDN通过智能技术生成

**

Friday the Thirteenth 黑色星期五

**

解题思路来自NOCOW

题目:

13 号又是星期五是一个不寻常的日子吗?

13 号在星期五比在其他日少吗?为了回答这个问题,写一个程序来计算在 n 年里 13
日落在星期一,星期二…星期日的次数.这个测试从 1900 年 1 月 1 日到
1900+n-1 年 12 月 31 日.n 是一个非负数且不大于 400.
这里有一些你要知道的:
1900 年 1 月 1 日是星期一.
4,6,11 和 9 月有 30 天.其他月份除了 2 月有 31 天.闰年 2 月有 29 天,平年 2 月有 28 天.
年份可以被 4 整除的为闰年(1992=4*498 所以 1992 年是闰年,但是 1990 年不是闰年)
以上规则不适合于世纪年.可以被 400 整除的世纪年为闰年,否则为平年.所以,1700,1800,1900 和
2100 年是平年,而 2000 年是闰年.

解题思路:

Friday e the h Thirteenth (friday)
按月为单位计算,模拟运算,1900 年 1 月 13 日是星期六(代号 1),下个月的 13 日就
是代号(1+31-1) mod 7+1 的星期。
因为数据小,所以不会超时。
当数据比较大时,可以以年为单位计算,每年为 365 天,mod 7 的余数是 1,就是说每
过一年所有的日和星期错一天,闰年第 1、2 月错 1 天,3 月以后错 2 天。这样,只要先求
出第一年的解,错位添加到以后的年即可。
详细分析:因为 1900.1.1 是星期一,所以 1900.1.13 就等于(13-1) mod7+1=星期六。这
样讲可能不太清楚。那么,我来解释一下:每过 7 天是一个星期。n 天后是星期几怎么算呢?
现在假设 n 是 7 的倍数,如果 n 为 14,那么刚好就过了两个星期,所以 14 天后仍然是星期
一。但如果是过了 15 天,那么推算就得到是星期二。这样,我们就可以推导出一个公式来
计算。(n 天 mod 7(一个星期的天数)+ 现在日期的代号) mod 7 就等于现在日期的代号 。
当括号内的值为 7 的倍数时,其代号就为 0。

接下来是我的思路

用两个数组记录闰年和平年每个月的天数
用取模的方法(如上)计算n天后是星期几
用days记录经过的天数,在每次循环后加上当前月份的天数即为下一个13号经过的天数
AC代码如下:

#include <iostream>
#include <string>
#include <map>            
using namespace std;
int main()
{
   
    int n;         //total years
    cin >> n;
    int pn[12
  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值