数字(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; }