题目描述
众所周知,13号又是星期五成为"黑色星期五",真的是一个不寻常的日子吗?13号是星期五比13号是星期一、13号是星期二、……、13号是星期日要少吗? PIPI想知道这个问题的答案,所以想请聪明的你来写一个程序来计算在n年里每月13日落在星期一、星期二、……、星期日的次数。
这个测试从1900年1月1日到1900+n-1年12月31日。n是一个正整数且不大于400。
这里有一些你要知道的:
(1) 1900年1月1日是星期一。
(2) 4,6,9和11月有30天。其他月份除了2月有31天。闰年2月有29天,平年2月有28天。
(3) 年份可以被4整除并且不能被100整除,或者能够被400整除,那么该年为闰年。
输入
有多个测试用例,每个测试用例的输入占一行,包含一个正整数n。
n的表示为从1900之后的n年。
输出
每个测试用例的输出占一行。
该行有7个整数,整数之间用一个空格分隔,它们代表13日是星期六,星期日,星期一,……,星期五的次数。
样例输入
20
样例输出
36 33 34 33 35 35 34
【思路】注意1900年1月13日是周六.一个月一个月加,距1900年1月13日的天数,算是周几用求余.
eg:1900年1月13日-1900年2月13日中间差的天数是1900年1月的天数.
#include<iostream>
using namespace std;
//返回每月的天数
int get(int y,int m)
{
int i;
if((y%4==0&&y%100!=0)||(y%400==0)) i=1;//闰年
else i=0;//平年
if(m==1||m==3||m==5||m==7||m==8||m==10||m==12)
return 31;
else if (m==2)
{
if(i==1)
return 29;
else
return 28;
}
return 30;
}
int main(void)
{
int n;
while(scanf("%d",&n)!=EOF){
int a[7]={0},week=6;//1900年1月13日是周六
for(int i=1900;i<=1900+n-1;i++){
for(int j=1;j<=12;j++){
a[week%7]++;
week=week+get(i,j);//i:年,j:月 ,一直加每个月的天数
printf("%d\n",week);
}
}
cout<<a[6]<<" "<<a[0]<<" ";
for(int i=1;i<5;i++)
cout<<a[i]<<" ";
cout<<a[5]<<endl;
}
return 0;
}