吉姆拉尔森公式-黑色星期五

Description
算法训练 黑色星期五
时间限制:1.0s 内存限制:512.0MB

问题描述
  有些西方人比较迷信,如果某个月的13号正好是星期五,他们就会觉得不太吉利,用古人的说法,就是“诸事不宜”。请你编写一个程序,统计出在某个特定的年份中,出现了多少次既是13号又是星期五的情形,以帮助你的迷信朋友解决难题。

说明:(1)一年有365天,闰年有366天,所谓闰年,即能被4整除且不能被100整除的年份,或是既能被100整除也能被400整除的年份;(2)已知1998年1月1日是星期四,用户输入的年份肯定大于或等于1998年。

输入格式:输入只有一行,即某个特定的年份(大于或等于1998年)。
输出格式:输出只有一行,即在这一年中,出现了多少次既是13号又是星期五的情形。

输入输出样例
样例输入
1998
样例输出
3

解题思路:这题 可以用吉姆拉尔森公式解决,吉姆拉尔森公式是:
W = ( d + 2 m + 3 ( m + 1 ) / 5 + y + y / 4 y / 100 + y / 400 + 1 ) m o d 7 W= (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400+1)mod7
其中:w代表求得的星期
d代表日期数,因为本体要求的星期五是13号,所以这里d=13
m代表月份数
y代表年数
但是要注意,在计算的时候,我们要把今年的1月和2月当成上一年的13月和14月来计算(至于为什么要这么做就要去问吉姆拉尔森dalao了,我们直接用就行了)。当然,在计算着两个月份的时候,年份数必须也要相应地减一

代码:

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

int y,w,cont;

int main(void)
{
    cont=0;//初始化
    cin>>y;
    for(int i=1;i<=12;i++)
    {
        if(i==1)
            w=(13+2*13+3*14/5+y-1+(y-1)/4-(y-1)/100+(y-1)/400+1)%7;//千万别忘了这里y要减一
        else if(i==2)
            w=(13+2*14+3*15/5+y-1+(y-1)/4-(y-1)/100+(y-1)/400+1)%7;
        else
            w=(13+2*i+3*(i+1)/5+y+y/4-y/100+y/400+1)%7;
        if(w==5)
            cont++;
    }
    cout<<cont<<endl;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_42891420/article/details/88077532