[蓝桥杯][算法提高VIP]任意年月日历输出

题目

题目链接

题解

注意两点:

  1. 计算从2007.1.1到输入年份、月份的天数;
  2. 根据天数算出输入的月份开始于星期几。
    计算出这两个,控制一下输出格式就可以了。

天数的计算:
众所周知的口诀

一三五七八十腊,三十一天永不差,四六九冬三十整……

一月、三月、五月、七月、八月、十月、十二月都是三十一天;四月、六月、九月、十一月都是三十天;闰年二月是二十九天,其他时候二月都是二十八天。

闰年:年份能被400整除,或能被4整除但不能被100整除

也就是闰年一年是366天,平年一年是365天。


知道了这些知识就可以计算出天数了,假设输入的年份为year,月份为month。
因为题目告诉2007.01.01的信息了,因此我们要以2007.01.01为起点向后推算。

2007 ~ year-1的天数,含义为2007全年的天数(平年365)、2008全年的天数(闰年366)、……、year-1全年的天数;

算出第year年之前的天数了,但是从第year年1月1日开始到第year年month-1月最后一天的天数还没算。给个循环累加一下就行了,但还是要注意判断平闰。

两部分的累加和就是总天数。


得到天数,以2007.01.01的星期一为起始,每7天循环一个星期,不用多讲了吧。


强调一点,上面闰年的定义啊,每个月的天数啊,天数的求法啊都要掌握,蓝桥经常出。

代码

#include<bits/stdc++.h>
using namespace std;

int mon[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int year, month, sum, res;

int main()
{
	cin>>year>>month;
	cout<<"---------------------"<<endl;
	cout<<" Su Mo Tu We Th Fr Sa"<<endl;
	cout<<"---------------------"<<endl;
	
	sum = 365;
	for(int i = 2007;i < year;i ++) res += ((i%400==0 || (i%4==0 && i%100!=0))?1:0) + sum; // 闰年多一天
	
	if(year%400==0 || (year%4==0 && year%100!=0)) mon[2] ++; // 闰年多一天
	for(int i = 1;i < month;i ++) res += mon[i];
	
	int ii = (res%7==6?0:res%7+1);
	for(int i = 1;i <= ii;i ++) cout<<"   ";
	for(int i = ii, j = 1;j <= mon[month];i ++,j ++) {
		if(i == 7) i = 0, cout<<endl;
		printf("%3d", j);
	}
	
	cout<<endl<<"---------------------"<<endl;

	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不牌不改

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值