日历:推算日期与星期

11 篇文章 0 订阅

日历

日历是用于表述时间的系统,从小时到分钟,从月到日,最后从年份到世纪。术语小时、 日、月、年、世纪都是日历系统表述时间的单位。 按照目前国内使用的阳历,闰年被定义为能被4整除的年份,但是能被100整除而不能被 400整除的年是例外,它们不是闰年。例如:1700、1800、1900和2100不是闰年,而1600、 2000和2400是闰年。给定公元2000年1月1日后的天数,你的任务是给出这一天是哪年哪月哪日星期几。

输入格式

输入包含若干行,每行包含一个正整数,表示2000年1月1日后的天数。输入最后一行是 -1,程序不必处理。可以假设输出的年份不会超过9999。

输出格式

对每个测试样例输出一行,该行包含对应的日期和星期几。格式为“YYYY-MM-DD DayOfWeek”,其中 “DayOfWeek” 必须是下列常量中的一个:“Sunday”,“Monday”, “Tuesday”,“Wednesday”,“Thursday”,“Friday” 或 “Saturday”。

输入样例

1629
1345
1001
1876
-1

输出样例

2004-06-17 Thursday
2003-09-07 Sunday
2002-09-28 Saturday
2005-02-19 Saturday

解决方法如下
#include <iostream>
#include <cstdlib>
using namespace std;
int run(int yyear);//闰年366天,平年365天 
void format(int mmdd);//月份、日期为个位数时,补0 
int a[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};//月份的天数 

int main(){
	int n;
	while(cin>>n&&n!=-1){
		int n1=-1,year=2000,month=1,date=0;
		while(n-n1>run(year)){//计算年份 
			n1+=run(year);
			if(n-n1>0)
				year++; 
		}
		
		if(run(year)==366)//设置二月天数 
			a[2]=29;
		else
			a[2]=28;
			
		while(n-n1>a[month]){//计算月份 
			n1+=a[month];
			if(n-n1>0)
				month++;
		}
		while(n-n1>0){//计算日期 
			date++;
			n1++;
		}
		cout<<year<<'-';//输出年月日 
		format(month);
		cout<<'-';
		format(date);
		//星期 
		switch(n%7){
			case 0:cout<<" Saturday"<<endl;break;
			case 1:cout<<" Sunday"<<endl;break;
			case 2:cout<<" Monday"<<endl;break;
			case 3:cout<<" Tuesday"<<endl;break;
			case 4:cout<<" Wednesday"<<endl;break;
			case 5:cout<<" Thursday"<<endl;break;
			case 6:cout<<" Friday"<<endl;break;
		}
	}
	return 0;
}

int run(int yyear){
	if(!(yyear%4)){
		if(!(yyear%100)&&(yyear%400))
			return 365;	
		else
			return 366;	
	}
	else
		return 365;		
}

void format(int mmdd){
	if(mmdd<10){
		cout<<'0'<<mmdd;
	}
	else
		cout<<mmdd;
}

  1. 代码中,n1用于计算已计入year、month、date的天数。设置为-1,是因为题目要求为2000-01-01之后的天数,即假设输入30,输出应为2000年的第31天。
  2. 全局数组a[13]用于表示每月的天数,将数组第一个元素a[0]弃用,从索引值1开始为一月份。二月份的天数(即 a[2] )用28做初始化,后面用if语句再做修改。
  3. 计算年份与计算月份的原理相同,通过比较(n-n1)相对于下一年(月)的天数,来判断是否对year、month 进行递增。while语句的括号里面不能加上“ = ”,会导致下一级日历(year的下一级是month,month的下一级是date)出现错误。如果加上等于号,会出现例如输入30,输出为2000-01-00;输入365,输出为2000-01-00。
  4. 日期直接采取累加直到n=n1。
  5. 星期几采用将输入的数据对7取余。因为2000-01-01为Saturday,故余数为0时的那一天对应的为Saturday,以此类推。余数为1对应Sunday,余数为2对应Monday…
  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值