数字(number) (黑色星期五改编题)

              数字(number)

   【题目背景】

    谔谔啊啊啊啊啊啊啊啊啊!!!

   【题目描述】

    今天(当我写下这行字)是公历2019 年9 月19  日,星期四。

    CKH 是一个迷信的女孩子,如果某个月的13 号是星期五,那她就会吓得大叫。

    如果一年中有x  个月份满足这个条件,她在这一年就会大叫x  次。

    现在她想问你一个问题,从A 年到B 年的这段时间里,她分别有多少年会大叫0

~ 12  次。

    由于某些众所周知的原因,1919 年是神创造世界的元年。所以我们从1919 年1 月

1  日开始计算。(这并不意味着这一天是星期一!)
                . . . . . . . . . . . . .

   【输入格式】

    从文件number.in  中读入数据。

                                                         9
    输入的第一行包含两个正整数A, B,保证1919 ≤ A  ≤ B ≤ 10  ,含义如上所述。

   【输出格式】

    输出到文件number.out  中。

    输出13 行,第i 行格式如下:

    i : x

    表示在这段时间内有x  年CKH 大叫了i 次。

   【样例1 输入】

    2019 2020

   【样例1 输出】

    0: 0

    1: 0

    2: 2

    3: 0

    4: 0

    5: 0

6: 0

    7: 0

    8: 0

    9: 0

    10: 0

    11: 0

    12: 0
【提示】

    如果某个年份(是400  的倍数) 或者(是4  的的倍数且不是100  的倍数)  ,这一年

的2 月有29 天。


显然每400年一循环,打表打出四百年的答案,看有多少个四百年,剩下的暴力处理就行了。

#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<cstdio>
using namespace std;
int ans[20],y[20],ss[20];
int a,b;
int main()
{
    y[1]=5,y[2]=1,y[3]=1,y[4]=4;
    y[5]=6,y[6]=2,y[7]=4,y[8]=0;
    y[9]=3,y[10]=5,y[11]=1,y[12]=3;//2001年每月13号在周几
   cin>>a>>b;
   int a1=a/400,b1=b/400;
   ans[1]+=171*(b1-a1),ans[2]=170*(b1-a1),ans[3]=59*(b1-a1);//统计400的个数
//每个闰年周数加2 平年周数加1
int c=0; a1=a%400; if(a1>=1) ans[2]--; for(int i=2002;i<=2000+a1-1;i++) { if(c==1) y[1]+=1,y[2]+=1,c=0; for(int j=1;j<=12;j++) y[j]+=1; if(i%400==0 || (i%4==0 && i%100!=0) ) { for(int j=3;j<=12;j++) y[j]+=1; c=1; } for(int j=1;j<=12;j++) y[j]%=7; int temp=0; for(int j=1;j<=12;j++) if(y[j]==4) temp++; ans[temp]--; } y[1]=5,y[2]=1,y[3]=1,y[4]=4; y[5]=6,y[6]=2,y[7]=4,y[8]=0; y[9]=3,y[10]=5,y[11]=1,y[12]=3; c=0; b1=b%400; if(b1>=1) ans[2]++; for(int i=2002;i<=2000+b1;i++) { if(c==1) y[1]+=1,y[2]+=1,c=0; for(int j=1;j<=12;j++) y[j]+=1; if(i%400==0 || (i%4==0 && i%100!=0) ) { for(int j=3;j<=12;j++) y[j]+=1; c=1; } for(int j=1;j<=12;j++) y[j]%=7; int temp=0; for(int j=1;j<=12;j++) if(y[j]==4) temp++; ans[temp]++; } if(a1==0) ans[1]++; for(int i=0;i<=12;i++) cout<<i<<": "<<ans[i]<<endl; return 0; }

猜你喜欢

转载自www.cnblogs.com/hfang/p/11617743.html