日期的处理 - 高斯日记 - 端午节 - 计算日期后续


问题 A: 高斯日记

时间限制: 1 Sec   内存限制: 128 MB

题目描述

大数学家高斯有个好习惯:无论如何都要记日记。 他的日记有个与众不同的地方,他从不注明年月日,而是用一个整数代替,比如:4210 后来人们知道,那个整数就是日期,它表示那一天是高斯出生后的第几天。这或许也是个好习惯,它时时刻刻提醒着主人:日子又过去一天,还有多少时光可以用于浪费呢? 高斯出生于:1777年4月30日。 在高斯发现的一个重要定理的日记上标注着:5343,因此可算出那天是:1791年12月15日。 高斯获得博士学位的那天日记上标着:8113 请你算出高斯获得博士学位的年月日。

输入

输出

提交答案的格式是:yyyy-mm-dd, 例如:1980-03-21



问题 B: 端午节

时间限制: 1 Sec   内存限制: 128 MB

题目描述

2014 6 2 日是端午节,也是小粽子同学的 18 岁生日。可以推算出小粽子同学出生于星期日,经历了 6575 天(出生当天也算 1 天)。

输入

输入一个日期

输出

输出2 个数。第1个数表示此人从出生到 2014 6 2 日所经过的天数,第 2 个数表示这个人的出生日期是星期几。

样例输入

1975 9 1

样例输出

14155
1

问题 C: 计算后续日期

时间限制: 1 Sec   内存限制: 128 MB

题目描述

我们经常要计算,从今天往后N天之后是哪一天(哪年哪月哪日)。现在我们就可以编写一个程序,推算指定日期之后的第N天是什么日期。

输入

输入有多组。每组测试用例有一行,包括四个整数,分别表示年,月,日和第N天。

输出

对于每组测试用例,输入由一行组成,表示(年月日+N天后的)的年-月-日

样例输入

2012 4 9 91
2013 1 1 364

样例输出

2012-7-9
2013-12-31



这三道题其实可以看作一道题,其核心的需求概括出来可以得到两个函数,即根据天数求日期和根据日期求天数。如下:



#include<cstdio>
#include<cmath>
#include<cstring>
#include<iostream>
#include<iomanip>
#include<cstdlib>
#include<algorithm>
#include<string>
#include<vector>
#include<queue>
#include<stack>
#include<set>
#include<list>

using namespace std;


int mon[2][12] = { { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 },
{ 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 } };
int yea[2] = { 365,366 };
int is_leap(int a)//是否是闰年,是则返回1,不是则返回0
{
	if ((a % 4 == 0 && a % 100 != 0) || a % 400 == 0)return 1;
	else return 0;
}
//返回从1年1月1日开始(包括当天)到输入天数(不包括当天)所经历的天数
int get_days(int year, int month, int day)
{
	int sum = 0;
	for (int i = year; i > 1; i--)
	{
		sum += yea[is_leap(i)];
	}
	for (int j = month; j > 1; j--)
	{
		sum += mon[is_leap(year)][j - 1];
	}
	sum += day - 1;
	return sum;
}
//输入n(n大于0),则返回从1年1月1日(包括当天)开始经过了n天后的日期(不包括当天)
void use_days(int sum, int &year, int &month, int &day)
{
	for (year = 1; sum >= yea[is_leap(year)]; year++)
	{
		sum -= yea[is_leap(year)];
	}
	for (month = 0; sum >= mon[is_leap(year)][month]; month++)
	{
		sum -= mon[is_leap(year)][month];
	}
	month++;
	day = sum + 1;
	return;
}



得到这两个函数之后各题的主函数就容易得到了,如下:


/高斯日记
int main()
{
	int year, month, day, n;
	year = 1777;
	month = 4;
	day = 30;
	n = 8113;
	n += get_days(year, month, day);
	use_days(n, year, month, day);
	cout << year << "-" << month << "-" << day << endl;
	return 0;
}
/端午节
int main()
{
	int year, month, day, n;
	while (cin >> year >> month >> day)
	{

		int a = get_days(year, month, day);
		int b = get_days(2014, 6, 2);
		//a+1是因为要包括当天,后来还+1是为了使得第一天为星期一而不是星期零
		int week = (a + 1) % 7 + 1;
		cout << b - a + 1 << endl << week << endl;
	}
	return 0;
}
/计算后续日期
int main()
{
	int year, month, day, n;
	while (cin >> year >> month >> day >> n)
	{
		n+= get_days(year, month, day);
		use_days(n, year, month, day);
		cout << n << endl;
		cout << year << "-" << month << "-" << day << endl;
	}
	return 0;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值