数字(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; }
标签:int,ans,number,a1,星期五,b1,400,include,改编 来源: https://www.cnblogs.com/hfang/p/11617743.html