1288: 黑色星期五

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;
}
 
发布了25 篇原创文章 · 获赞 20 · 访问量 3265

猜你喜欢

转载自blog.csdn.net/qq_44886056/article/details/100595966