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代表日期数,因为本体要求的星期五是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;
}