神犇营-USACO1.1.3-黑色星期五

【小韦同学@神犇营-USACO1.1.3-黑色星期五】

题目:

描述

13号又是一个星期五。13号在星期五比在其他日子少吗?为了回答这个问题,写一个程序,要求计算每个月的十三号落在周一到周日的次数。
给出N年的一个周期,要求计算1900年1月1日至1900+N-1年12月31日中十三号落在周一到周日的次数,N为正整数且不大于400.
注意,开始今年是一千九百年,不是1990
这里有一些你要知道的:
1、1900年1月1日是星期一.
2、4,6,11和9月有30天.其他月份除了2月都有31天.闰年2月有29天,平年2月有28天.

3、年份可以被4整除的为闰年(1992=4*498 所以 1992年是闰年,但是1990年不是闰年).

4、以上规则不适合于世纪年。可以被400整除的世纪年为闰年,否则为平年。所以,1700,1800,1900和2100年是平年,而2000年是闰年.
请不要调用现成的函数
请不要预先算好数据(就是叫不准打表)!

输入

一个正整数N

输出

七个在一行且相分开的整数,它们代表13日是星期六、星期日、星期一、…星期五的次数

输入样例1

20

输出样例1

36 33 34 33 35 35 34

题解:

/********************************************************************* 

* 题目:神犇营-USACO1.1.3-黑色星期五 
* 作者:小韦同学 
* 邮箱:weichangying_wcy@163.com 

* 题解:
	思路:
	(1)从1900年1月1日开始数天数,因为1900年1月1日是周一,所以相应的
	周几就是累计的天数模7,若模7等于0则为周日,等于1为周一,等于2为周
	二、、、等于6为周六。 
	(2)枚举从1900年1月到所求的年份12月,算每个月的13号累计的天数,用
	该天数模7即可。
	(3)然后算出每个13号累计的天数?首先从1900年1月13日开始,这个13号
	累计的天数是13天,1900年2月13日这天的累计天数是13加上1月份的天数。
	故每一个月的13号的累计天数是上一个13号累计天数加上上个月的天数,因
	为每个月从1号到13号是固定的,变化的就是从上个月13号到上个月结束这段
	时间。,所以其实增加的累计天数就是上个月的天数。 
	注意:
	1°注意计算累计天数和数13号是周几的天数的顺序。 
	2°记得先输出周六。 
	
*********************************************************************/ 

#include <iostream>
using namespace std;

// 平年每个月的天数 
int month[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int day[7] = {0};

// 判断是否为闰年,为闰年返回true 
bool is_true(int year) {
	if (year % 400 == 0 || year % 4 == 0 && year % 100 != 0) {
		return true;
	}
	return false;
}

void count(int n) {
	int d = 13;  // 1900年1月13日的累计天数 
	for (int y = 1900; y < 1900 + n; y++) {  // 枚举每一年 
		for (int m = 1; m <= 12; m++) {  // 枚举每个月 
			// 对应的周几加1,注意要先做这个操作,然后再累计天数
			day[d % 7]++;   
			// 当是闰年的时候,2月累计天数加1 
			if (m == 2 && is_true(y)) d++;
			d += month[m];  // 加上当月的天数,到下一个月的13号 
		}
	}
}

int main() {

	int n;
	cin >> n;
	count(n);
	cout << day[6];  // 先输出周六的天数 
	for (int i = 0; i < 6; i++) {
		cout << " " << day[i];
	}
	
	return 0;
}

我是小韦同学,企者不立,跨者不行,每天进步一点点。
欢迎大家多多交流,如果发现有错误,请多指正。有疑问的同学也可以留言评论或者发邮件。
邮箱:weichangying_wcy@163.com

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值