题目描述
算法训练 黑色星期五
时间限制:1.0s 内存限制:512.0MB
问题描述
有些西方人比较迷信,如果某个月的13号正好是星期五,他们就会觉得不太吉利,用古人的说法,就是“诸事不宜”。请你编写一个程序,统计出在某个特定的年份中,出现了多少次既是13号又是星期五的情形,以帮助你的迷信朋友解决难题。
说明:(1)一年有365天,闰年有366天,所谓闰年,即能被4整除且不能被100整除的年份,或是既能被100整除也能被400整除的年份;(2)已知1998年1月1日是星期四,用户输入的年份肯定大于或等于1998年。
输入格式:输入只有一行,即某个特定的年份(大于或等于1998年)。
输出格式:输出只有一行,即在这一年中,出现了多少次既是13号又是星期五的情形。
输入输出样例
样例输入
1998
样例输出
3
思路:emmmm,其实也不算一道特别水的题目,我写了蛮久(因为没注意一个变量问题...)的。不过也值得记录一下因为week=(date+orginal_week-1)%7计算星期几很管用。
说下我的思路吧:先算出要计算那一年的1月1号是星期几然后再遍历该年每个月13号看是否为星期五然后记录下来。
附上AC代码
#include <iostream>
using namespace std;
int day[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
int main()
{
int n,cnt = 0,flag,t = 0;
cin>>n;
for(int i = 1998;i<n;i++)
if((i%4==0&&i%100!=0)||(i%400==0))
cnt+=366;
else
cnt+=365;
int start = (cnt+4)%7;//cnt=0所以减1加1抵消
if((n%4==0&&n%100!=0)||(n%400==0))
flag = 1;
else
flag = 0;
cnt = 0;
for(int i = 1;i<=12;i++){
if(flag&&i==3)
cnt++;
if((cnt+13+start-1)%7==5)//***重点
t++;
cnt+=day[i];
}
cout<<t;
return 0;
}