zoj 2420.Calendar

Calendar

#include <fstream>
#include <iostream>
#include <vector>
using namespace std;
//以下为阳历年月日的常识
//一年有12个月
//1 3 5 7 8 10 12月为大月,每月有31天
//4 6 9 11月为小月,每月有30天
//如果是闰年,2月有29天,否则,2月只有28天
//定义打印日期结构
struct Info{
	short int year;
	short int month;
	short int day;
	short int week;
};
//定义向量来存储日期信息表
vector<Info> v;
bool RR(int year)
{
	//符合下面两个条件之一,就是闰年
	//(1)能被4整除,但不能被100整除;
	//(2)能被4整除,又能被400整除。
	if((year%4==0 && year%100!=0) || (year%400==0))
		return true;
	else
		return false;
}
int main(int argc, char* argv[])
{
//	ifstream cin("aaa.txt");
	int i,j,k;
	int p=0;
	Info info;
	int flag=0;//闰年标志
	int week=5;
	//建立2000-01-01到9999-12-31的日期计日表
	for(i=2000;i<=9999;i++)//年份
	{
		flag=RR(i);
		for(j=1;j<=12;j++)//月份
		{
			for(k=1;k<=31;k++)//日
			{
				//1 3 5 7 8 10 12月为大月,每月有31天
				if((j==1) || (j==3) || (j==5) || (j==7) || (j==8) || (j==10) 						|| (j==12))
					p++;
				//4 6 9 11月为小月,每月有30天
				else if((j==4) || (j==6) || (j==9) || (j==11))
				{
					if(k!=31)p++;
					else
						break;//跳到下一个月
				}
				//如果是闰年,2月有29天,否则,2月只有28天
				else if(j==2)
				{
					if(flag)//是闰年
					{
						if(k!=30 && k!=31)p++;
						else
							break;//跳到下一个月
					}
					else//不是闰年
					{
						if(k!=29 && k!=30 && k!=31)p++;
						else
							break;//跳到下一个月
					}
				}
				info.year=i;
				info.month=j;
				info.day=k;
				week++;
				if(week==8)week=1;
				info.week=week;
				v.push_back(info);				
			}
		}
	}
	int n;
	while(cin>>n)
	{
		if(n==-1)break;
		else
		{
			cout<<v[n].year<<"-";
			if(v[n].month<10)cout<<"0"<<v[n].month<<"-";
			else
				cout<<v[n].month<<"-";
			if(v[n].day<10)cout<<"0"<<v[n].day<<" ";
			else
				cout<<v[n].day<<" ";
			if(v[n].week==1)
				cout<<"Monday"<<endl;
			else if(v[n].week==2)
				cout<<"Tuesday"<<endl;
			else if(v[n].week==3)
				cout<<"Wednesday"<<endl;
			else if(v[n].week==4)
				cout<<"Thursday"<<endl;
			else if(v[n].week==5)
				cout<<"Friday"<<endl;
			else if(v[n].week==6)
				cout<<"Saturday"<<endl;
			else if(v[n].week==7)
				cout<<"Sunday"<<endl;
		}
	}
	return 0;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值