蓝桥杯 算法提高 5-3日历

  算法提高 5-3日历  
时间限制:1.0s   内存限制:256.0MB
    
问题描述
  已知2007年1月1日为星期一。设计一函数按照下述格式打印2007年以后(含)某年某月的日历,2007年以前的拒绝打印。为完成此函数,设计必要的辅助函数也是必要的。
样例输入
一个满足题目要求的输入范例。
例:

2050 3
样例输出
与上面的样例输入对应的输出。
例:


数据规模和约定
  输入数据中每一个数的范围。
  例:年 2007-3000,月:1-12。

注意这个的格式:
	cout <<"---------------------"<<endl;
	cout <<"Su Mo Tu We Th Fr Sa "<<endl;
	//cout <<"Su "<<"Mo "<<"Tu "<<"We "<<"Th "<<"Fr "<<"Sa "<<endl;
	cout <<"---------------------"<<endl;



#include<iostream>
using namespace std;
is_leapyear(int y){
	if((y%100==0&&y%100!=0)||y%400==0)
	return 1;
	else
	return 0;
}
int main()
{
	int i,j,year,month;
	cin >>year>>month;
	int a[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};//平年
	int la[13]={0,31,29,31,30,31,30,31,31,30,31,30,31};
	int c=1; //今年到该月一号的天数. 
	int flag=0;
	if(is_leapyear(year))
	flag=1;
	for(i=0;i<month;i++){
		if(flag==1)
			c+=la[i];
		else
			c+=a[i];
	}
	int s=(year-1)+((year-1)/4)+((year-1)/400)-((year-1)/100)+c;
	int week=s%7;
	
	//cout <<"week=="<<week<<endl;
	
	cout <<"Calendar   "<<year<<" - ";
	if(month<10)
	cout <<"0";
	cout <<month<<endl;
	cout <<"---------------------"<<endl;
	cout <<"Su Mo Tu We Th Fr Sa "<<endl;
	//cout <<"Su "<<"Mo "<<"Tu "<<"We "<<"Th "<<"Fr "<<"Sa "<<endl;
	cout <<"---------------------"<<endl;
	if(flag==1){
		for(j=0;j<week;j++)
		cout <<"   ";
		for(i=1;i<=la[month];i++){
			if((week+i-1)%7==0)
			cout <<endl;
			if(i<10)
			cout <<" ";
			cout <<i<<" ";
		}
	}
	else{
		for(j=0;j<week;j++)
		cout <<"   ";
		for(i=1;i<=a[month];i++){
			if((week+i-1)%7==0)
			cout <<endl;
			if(i<10)
			cout <<" ";
			cout <<i<<" ";
		}
		
	}
	cout <<endl;
	cout <<"---------------------"<<endl;
	return 0;
}

/*计算公元某年某月某日是星期几,是这样的一个算式:
S=(x-1)+[(x-1)/4]-[(x-1)/100]+[(x-1)/400]+C 
其中X是公元的年数,C是从这一年的元旦算起到这一天为止(包括这一天是内)的天数.
方括号表示其中算式的整数部分,即在计算S的值时,三个方括号中只要算出商数的整数部分,把余数略去不计.
求出S的值之后,除以7,余几就是星期几;除尽了就是星期日.
我们来计算一下2008年12月25日是星期几?此时x=2008 C=360于是可得 
:S=(2008-1)+[(2008-1)÷4]-[(2008-1)÷100]+[(2008-1)÷400]+360=2853 3853÷7=407……4 
那么2008年的12月25日是星期四
*/


2017-12-16
#include<iostream>
using namespace std;
int judge_leap(int y){
	if((y%4==0&&y%100!=0)||y%400==0)
	return 1;
	return 0;
}
int main()
{
	int i,j,y,m;
	int a[13];
	cin >>y>>m;
	if(judge_leap(y))
		int a[13]={0,31,29,31,30,31,30,31,31,30,31,30,31};
	else
	 	int a[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
	int day=1;
	for(i=0;i<m;i++){
		day+=a[i];
	}
	//calu 星期几
	int t=y-1+(y-1)/4+(y-1)/400-(y-1)/100+day;
	t%=7;
	cout <<"Calendar "<<y<<" - ";
	if(m<10)
	cout <<"0";
	cout <<m<<endl;
	cout <<"---------------------"<<endl;
	cout <<"Su Mo Tu We Th Fr Sa"<<endl;
	cout <<"---------------------"<<endl;
	for(i=0;i<t;i++)
	cout <<"   ";
	for(i=1;i<=a[m];i++){
		if((i+t-1)%7==0)
		cout <<endl;
		if(i<10){
			cout <<" "<<i<<" ";
		}
		else
		cout <<i<<" ";
	}
	cout <<endl<<"---------------------"<<endl;
	return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值