1042: 黑色星期五

题目描述
众所周知,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;
}
发布了44 篇原创文章 · 获赞 1 · 访问量 2293

猜你喜欢

转载自blog.csdn.net/Do_________/article/details/103845283