资深守护
题目链接: 酷町堂:4964
4964 日历本
经验值:2000
时间限制:1000毫秒
内存限制:128MB
题目描述 De**ion
我们经常需要使用日历,所以需要一个能生成日历的程序。
先要求你写一个程序,只需要输入年份,就能生成正确的日历。
输入描述 Input De**ion
输入包含多组测试数据。每组输入一个整数Y(1800<=Y<=2100),表示公元年份。
输出描述 Output De**ion
对于每组输入,输出对应的日历本。选中下面的输出样例查看具体的输出格式,注意空格的输出。
样例输入 Sample Input
复制
2010
样例输出 Sample Output
2010 January February March Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa 1 2 1 2 3 4 5 6 1 2 3 4 5 6 3 4 5 6 7 8 9 7 8 9 10 11 12 13 7 8 9 10 11 12 13 10 11 12 13 14 15 16 14 15 16 17 18 19 20 14 15 16 17 18 19 20 17 18 19 20 21 22 23 21 22 23 24 25 26 27 21 22 23 24 25 26 27 24 25 26 27 28 29 30 28 28 29 30 31 31 April May June Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa 1 2 3 1 1 2 3 4 5 4 5 6 7 8 9 10 2 3 4 5 6 7 8 6 7 8 9 10 11 12 11 12 13 14 15 16 17 9 10 11 12 13 14 15 13 14 15 16 17 18 19 18 19 20 21 22 23 24 16 17 18 19 20 21 22 20 21 22 23 24 25 26 25 26 27 28 29 30 23 24 25 26 27 28 29 27 28 29 30 30 31 July August September Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa 1 2 3 1 2 3 4 5 6 7 1 2 3 4 4 5 6 7 8 9 10 8 9 10 11 12 13 14 5 6 7 8 9 10 11 11 12 13 14 15 16 17 15 16 17 18 19 20 21 12 13 14 15 16 17 18 18 19 20 21 22 23 24 22 23 24 25 26 27 28 19 20 21 22 23 24 25 25 26 27 28 29 30 31 29 30 31 26 27 28 29 30 October November December Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa 1 2 1 2 3 4 5 6 1 2 3 4 3 4 5 6 7 8 9 7 8 9 10 11 12 13 5 6 7 8 9 10 11 10 11 12 13 14 15 16 14 15 16 17 18 19 20 12 13 14 15 16 17 18 17 18 19 20 21 22 23 21 22 23 24 25 26 27 19 20 21 22 23 24 25 24 25 26 27 28 29 30 28 29 30 26 27 28 29 30 31 31
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<list>
#include<queue>
#include<map>
#include<cstdlib>
#include<iomanip>
#include<stack>
#include<sstream>
#include<vector>
using namespace std;
int y,m,d;
int xq[13]={0,3};
string TMP="Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa";
int T=1800,T1=1,T2=1;
int month[13]={0,31,0,31,30,31,30,31,31,30,31,30,31};
int yesd(int x){
return x%4==0&&x%100!=0||x%400==0;
}
void ztx(int x){
int ttmp=x*3-2;
cout<<TMP<<endl;
int T=0,T2=0,T3=0;
// int cnt=xq[1]%7,cnt2=7-xq[1]%7;
int cnt[10];
cnt[1]=xq[ttmp]%7;
cnt[2]=7-xq[ttmp]%7;
cnt[3]=xq[ttmp+1]%7;
cnt[4]=7-xq[ttmp+1]%7;
cnt[5]=xq[ttmp+2]%7;
cnt[6]=7-xq[ttmp+2]%7;
bool flag=0,flag2=0;
int pos=0;
while(!(T==month[ttmp]&&T2==month[ttmp+1]&&T3==month[ttmp+2])){
for(int i=1;i<=cnt[1];i++){
cout<<" ";
}
cnt[1]=0;
for(int i=1;i<=cnt[2]&&T<month[ttmp];i++){
cout<<setw(2)<<++T<<" ";
}
cnt[2]=7;
if(T==month[ttmp]&&!flag2){
int tmp=(xq[ttmp]+month[ttmp])%7-1;
for(int i=1;i<=(6-tmp)%7;i++){
cout<<" ";
}
flag2=1;
}else if(flag2){
cout<<" ";
}
cout<<" ";
for(int i=1;i<=cnt[3];i++){
cout<<" ";
}
cnt[3]=0;
for(int i=1;i<=cnt[4]&&T2<month[ttmp+1];i++){
cout<<setw(2)<<++T2<<" ";
}
cnt[4]=7;
if(T2==month[ttmp+1]&&!flag){
int tmp=(xq[ttmp+1]+month[ttmp+1])%7-1;
for(int i=1;i<=(6-tmp)%7;i++){
cout<<" ";
}
flag=true;
}else if(flag){
cout<<" ";
}
cout<<" ";
for(int i=1;i<=cnt[5];i++){
cout<<" ";
}
cnt[5]=0;
for(int i=1;i<=cnt[6]&&T3<month[ttmp+2];i++){
cout<<setw(2)<<++T3<<" ";
}
cnt[6]=7;
cout<<endl;
pos++;
}
for(int i=pos;i<6;i++){
cout<<endl;
}
return ;
}
int main(){
/* 预处理*/
cin>>y;
m=1,d=1;
if(yesd(T)){
month[2]=29;
}else{
month[2]=28;
}
while(!(T==y&&T1==m&&T2==d)){
T2++;
if(T2>month[T1]){
T2=1;
T1++;
if(T1>12){
T1=1;
T++;
if(yesd(T)){
month[2]=29;
}else{
month[2]=28;
}
}
}
xq[1]++;
if(xq[1]>7) xq[1]=1;
}
if(yesd(y)){
month[2]=29;
}else{
month[2]=28;
}
T=y,T1=m,T2=d;
int T3=xq[1];
while(!(T==y+1&&T1==1&&T2==1)){
if(T2==1){
xq[T1]=T3;
}
T2++;
if(T2>month[T1]){
T1++;
T2=1;
if(T1>12){
T1=1;
T++;
}
}
T3++;
if(T3>7) T3=1;
}
cout<<" "<<y<<"\n\n";
/*开始输出*/
cout<<" January February March\n";
ztx(1);
cout<<" April May June\n";
ztx(2);
cout<<" July August September\n";
ztx(3);
cout<<" October November December\n";
ztx(4);
return 0;
}
样例是对的,自己测的也过了,但是就是0分,求解