算法提高 5-3日历
时间限制:1.0s 内存限制:256.0MB
问题描述
已知2007年1月1日为星期一。设计一函数按照下述格式打印2007年以后(含)某年某月的日历,2007年以前的拒绝打印。为完成此函数,设计必要的辅助函数也是必要的。
样例输入
一个满足题目要求的输入范例。
例:
2050 3
例:
2050 3
样例输出
与上面的样例输入对应的输出。
例:
例:
数据规模和约定
输入数据中每一个数的范围。
例:年 2007-3000,月:1-12。
例:年 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日是星期四
*/
#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;
}