1288: 黑色星期五
题目描述
有些西方人比较迷信,如果某个月的13号正好是星期五,他们就会觉得不太吉利,用古人的说法,就是“诸事不宜”。请你编写一个程序,统计出在某个特定的年份中,出现了多少次既是13号又是星期五的情形,以帮助你的迷信朋友解决难题。
说明:(1)一年有365天,闰年有366天,所谓闰年,即能被4整除且不能被100整除的年份,或是既能被100整除也能被400整除的年份;(2)已知1998年1月1日是星期四,用户输入的年份肯定大于或等于1998年。
输入
输入只有一行,即某个特定的年份(大于或等于1998年)。
输出
输出只有一行,即在这一年中,出现了多少次既是13号又是星期五的情形
样例输入
1998
样例输出
3
题目描述:
对于这种题目,我们最好使用结构体或者class来统一处理数据,因为这题本身就有些复杂,如果对于一大堆数据不能很好的处理,那这题简直就是噩梦级的难度了。。。我这里习惯用class来解决了,如果你不会class用结构体也是一样的,因为我只涉及到了class最简单的一部分。
其次我们再回到题目,这题我看到他的第一反映就是难点在每年第一个星期的判断,由于题目告诉了我们1998年的第一天是星期几,而且告诉了我们闰年的判断,所以我们可以根据这些来判断每一年的第一天是星期几。之后再根据题目逐步判断结果。
题解(已通过):
#include<iostream>
#include<cstdio>
#include<string.h>
#include<algorithm>
#include<math.h>
#include<typeinfo>
#include<string>
using namespace std;
class date//定义名字叫date的类
{//为了方便访问和修改,这里的变量就直接定义在公用里面了
public:
int year,month,day,xinqi,days;
bool run;
date()//构造函数
{
year=0;
month=0;
day=13;
xinqi=4;
run=0;//这个run是是否为闰年的意思,,
days=0;
}
void getyear();
};
void date::getyear()//定义内置函数
{
cin>>year;//为了方便,我们直接在输入年的时候,直接把这一年的第一个星期算出来
int i;
for(i=1998;i<year;i++){
if(i%100==0&&i%400==0){//判断输入的年是否是闰年
xinqi+=2;
run=1;//是闰年,则记录run=1
// cout<<"--";
}else if(i%4==0&&i%100!=0)
{
xinqi+=2;
run=1;
// cout<<"--";
}else
{
xinqi+=1;//一年有365天,除7取模后为1,所以当那一年不为闰年时,每过一年,星期+1,闰年的话,星期+2
}
if(xinqi-7>0)//当星期>7时,让它回归星期1
xinqi=xinqi-7;//考虑到xinqi一次加2的情况,所以表达式写成这种形式
run=0;
}
if(year%100==0&&year%400==0){
run=1;
}else if(year%4==0&&year%100!=0)
{
run=1;
}else
{
run=0;;
}
}
int adddays(int month ,bool run)//根据这一年是否是闰年,计算出第month个月时,已经过了多少天,方便后面星期的计算
{
int i,days=0;
for(i=1;i<=month;i++){//根据每个月的天数,计算总天数,这里要注意的是,月份等于前面所有月相加,但是不包括它自身
if(i==2||i==4||i==6||i==8||i==9||i==11){
days=days+31;
}else if(run==1&&i==3)
{
days+=29;
}else if(run==0&&i==3)
{
days+=28;
}
else if(i==3||i==5||i==7||i==10||i==12)
{
days+=30;
}else
{
days+=0;
}
}
return days;
}
int main()
{
date x;
int days,coun=0,a;
x.getyear();//输入年
for(x.month=1;x.month<13;x.month++){//从1月开始到12月循环判断
days=adddays(x.month,x.run);//计算到每个月1号的天数
days+=13;//计算每个月13号的天数
days=days%7;//计算经过这些天后的星期
a=x.xinqi+days-1;//计算出星期几,由于不能算上自身,所以要减1
if(a-7>0){
a=a-7;
}
if(a==5){//满足条件,用cun计数
coun++;
}
days=0;//每次循环后把days清0
}
cout<<coun;//打印输出
return 0;
}