您的位置:首页 > 编程语言 > C语言/C++

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

2016-06-12 02:12 741 查看

问题 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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++ 日期