版权声明:本文为博主原创文章 https://blog.csdn.net/snowy19130140/article/details/52133121
日期类问题
求两个日期差值
题目:有两个日期,求两个日期之间的天数,如果这两个日期是连续的我们规定他们之间的天数为两天
输入:有多组数据,魅族数据有两行,分别表示两个日期,形式为YYYYMMDD
输出:每组数据输出为一行,即日期差值
样例输入
20110412
20110422
样例输出
11
方法一:
#include <iostream>
#include <math.h>
#include <stdio.h>
#define _CRT_SECURE_NO_DEPRECATE
using namespace std;
int leap(int y) //闰年判断
{
if ((y % 100 != 0 && y % 4 == 0) || y % 400 == 0)
return 1;
else
return 0;
}
int yearday(int y1, int y2) //求两年之间的日期差
{
int day = 0;
if (y1 < y2 - 1)
{
for (int y = y1 + 1; y < y2; y++)
{
int flag = leap(y);
day += 365 + flag;
}
}
else
{
day = 0;
}
return day;
}
int Datestart(int y, int m, int d) //求该日期距今年开始有多少天
{
int day1 = 0;
int day[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31,30,31 };
if (d > day[m - 1])
return -1;
if (m == 1)
day1 = d;
else if (m == 2)
day1 = 31 + d;
else
{
if (d > day[m - 1])
return -1;
for (int i = 0; i < m-1; i++)
day1 += day[i];
int flag = leap(y);
day1 += d + flag;
}
return day1;
}
int Dateend(int y, int m, int d) //求该日期距离今年结束还有多少天
{
int day1 = 0;
int day[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31,30,31 };
if (d > day[m - 1])
return -1;
if (m > 2)
{
for (int i = m; i < 12; i++)
day1 += day[i];
day1 += day[m - 1] - d;
}
else
{
for (int i = m; i < 12; i++)
day1 += day[i];
int flag = leap(y);
day1 += day[m - 1] - d + flag;
}
return day1;
}
int Date(int y1, int m1, int d1, int y2, int m2, int d2)
{
int day=0;
int date[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31,30,31 };
if (y1 == y2)
{
if (m1 == m2)
day = abs(d1-d2);
else if (m1 < m2)
{
if (m1 > 2 || m2 == 2)
{
for (int i = m1 - 1; i < m2 - 1; i++)
day += date[i];
day = day - d1 + d2;
}
else
{
{
for (int i = m1 - 1; i < m2 - 1; i++)
day += date[i];
int flag = leap(y1);
day = day - d1 + d2 + flag;
}
}
}
else
{
if (m2 > 2 || m1 == 2)
{
for (int i = m2 - 1; i < m1 - 1; i++)
day += date[i];
day = day - d2 + d1;
}
else
{
{
for (int i = m2 - 1; i < m1 - 1; i++)
day += date[i];
int flag = leap(y1);
day = day - d2 + d1 + flag;
}
}
}
}
else if (y1 < y2)
{
if (y1 < y2 - 1)
{
int day1 = yearday(y1, y2);
int day2 = Datestart(y2, m2, d2);
int day3 = Dateend(y1, m1, d1);
day = day1 + day2 + day3;
}
else
{
int day2 = Datestart(y2, m2, d2);
int day3 = Dateend(y1, m1, d1);
day = day2 + day3;
}
}
else
{
if (y2 < y1 - 1)
{
int day1 = yearday(y2, y1);
int day2 = Datestart(y1, m1, d1);
int day3 = Dateend(y2, m2, d2);
day = day1 + day2 + day3;
}
else
{
int day2 = Datestart(y1, m1, d1);
int day3 = Dateend(y2, m2, d2);
day = day2 + day3;
}
}
return day;
}
int main()
{
int y1, m1, d1, y2, m2, d2;
// while (cin >> y1 >> m1 >> d1)
while(scanf_s("%4d%2d%2d", &y1, &m1, &d1) != EOF)
{
scanf_s("%4d%2d%2d", &y2, &m2, &d2);
// cin >> y2 >> m2 >> d2;
int day = Date(y1, m1, d1, y2, m2, d2) + 1;
printf("%d\n", day);
}
system("pause");
return 0;
}
- 方法一采用的方法是分别计算较大日期距今年开始已经过了多少天,较小日期距离该年结束还有多少天,在计算着两年之间完整年的天数,将得到的三个数据加起来,最后根据题目需要加上1(两个日期是连续的我们规定他们之间的天数为两天),就能得出答案了
方法二:
#include <stdio.h>
#define ISYEAP(x) x%100 != 0 && x%4 == 0 || x%400 == 0?1:0
//定义宏判断是否是闰年,方便计算每月天数
int dayofMonth[13][2] = { {0,0}, {31,31}, {28,29}, {31,31}, {30,30}, {31,31}, {30,30}, {31,31}, {31,31}, {30,30}, {31,31}, {30,30}, {31,31} }; //预存每月的天数,注意二月配合宏定义做特殊处理
struct Date
{
int Day;
int Month;
int Year;
void nextDay()
{
Day++;
if (Day > dayofMonth[Month][ISYEAP(Year)]) //若日期超过了当月最大日数
{
Day = 1;
Month++; //进入下个月
if (Month > 12)
{
Month = 1;
Year++; //进入下一年
}
}
}
};
int buf[5001][13][32]; //保存预处理的天数
int Abs(int x)
{
return x < 0 ? -x : x;
}
int main()
{
Date tmp;
int cnt = 0; //天数计数
tmp.Day = 1;
tmp.Month = 1;
tmp.Year = 0; //初始化日期类对象为0年1月1日
while (tmp.Year != 5001)
{
buf[tmp.Year][tmp.Month][tmp.Day] = cnt;
tmp.nextDay();
cnt++;
}
int d1, m1, y1;
int d2, m2, y2;
while (scanf_s("%4d%2d%2d", &y1, &m1, &d1))
{
scanf_s("%4d%2d%2d", &y2, &m2, &d2);
printf("%d\n", Abs(buf[y2][m2][d2]-buf[y1][m1][d1])+1);
}
return 0;
}
- 方法二中首先定义了一个类,不仅可以用来表示日期,还能够自动的计算出下一个日期。利用该类,一方面不断计算出当前日期的下一个日期,另一方面累加计数器,计算当前日期与原点日期的天数差,并将其保存在内存中,有了这些预处理出的数据,在计算两个特定日期差时,只要将两个日期与原点时间日期差相减,取绝对值,并根据题目需要加上1(两个日期是连续的我们规定他们之间的天数为两天),就能得出答案了。
Day of week
样例输入: 9 October 2001
样例输出: Tuesday
#include <iostream>
#include <math.h>
#include <stdio.h>
#define _CRT_SECURE_NO_DEPRECATE
using namespace std;
int leap(int y) //闰年判断
{
if ((y % 100 != 0 && y % 4 == 0) || y % 400 == 0)
return 1;
else
return 0;
}
int yearday(int y1, int y2) //求两年之间的日期差
{
int day = 0;
if (y1 < y2 - 1)
{
for (int y = y1 + 1; y < y2; y++)
{
int flag = leap(y);
day += 365 + flag;
}
}
else
{
day = 0;
}
return day;
}
int Datestart(int y, int m, int d) //求该日期距今年开始有多少天
{
int day1 = 0;
int day[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31,30,31 };
if (d > day[m - 1])
return -1;
if (m == 1)
day1 = d;
else if (m == 2)
day1 = 31 + d;
else
{
if (d > day[m - 1])
return -1;
for (int i = 0; i < m-1; i++)
day1 += day[i];
int flag = leap(y);
day1 += d + flag;
}
return day1;
}
int Dateend(int y, int m, int d) //求该日期距离今年结束还有多少天
{
int day1 = 0;
int day[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31,30,31 };
if (d > day[m - 1])
return -1;
if (m > 2)
{
for (int i = m; i < 12; i++)
day1 += day[i];
day1 += day[m - 1] - d;
}
else
{
for (int i = m; i < 12; i++)
day1 += day[i];
int flag = leap(y);
day1 += day[m - 1] - d + flag;
}
return day1;
}
int Date(int y1, int m1, int d1, int y2, int m2, int d2)
{
int day=0;
int date[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31,30,31 };
if (y1 == y2)
{
if (m1 == m2)
day = abs(d1-d2);
else if (m1 < m2)
{
if (m1 > 2 || m2 == 2)
{
for (int i = m1 - 1; i < m2 - 1; i++)
day += date[i];
day = day - d1 + d2;
}
else
{
{
for (int i = m1 - 1; i < m2 - 1; i++)
day += date[i];
int flag = leap(y1);
day = day - d1 + d2 + flag;
}
}
}
else
{
if (m2 > 2 || m1 == 2)
{
for (int i = m2 - 1; i < m1 - 1; i++)
day += date[i];
day = day - d2 + d1;
}
else
{
{
for (int i = m2 - 1; i < m1 - 1; i++)
day += date[i];
int flag = leap(y1);
day = day - d2 + d1 + flag;
}
}
}
}
else if (y1 < y2)
{
if (y1 < y2 - 1)
{
int day1 = yearday(y1, y2);
int day2 = Datestart(y2, m2, d2);
int day3 = Dateend(y1, m1, d1);
day = day1 + day2 + day3;
}
else
{
int day2 = Datestart(y2, m2, d2);
int day3 = Dateend(y1, m1, d1);
day = day2 + day3;
}
}
else
{
if (y2 < y1 - 1)
{
int day1 = yearday(y2, y1);
int day2 = Datestart(y1, m1, d1);
int day3 = Dateend(y2, m2, d2);
day = day1 + day2 + day3;
}
else
{
int day2 = Datestart(y1, m1, d1);
int day3 = Dateend(y2, m2, d2);
day = day2 + day3;
}
}
return day;
}
int exchange_month(char* m)
{
char month[12][20] = {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"};
int k = 0;
for (int i = 0; i < 12; i++)
{
int tmp = strcmp(m, month[i]);
if (tmp == 0)
{
k = i;
break;
}
}
return k + 1;
}
int Getweek(int y, int m, int d) //计算星期名
{
int weeki = 0;
int day;
//以2016年8月7日,星期日为参照时间
if (y > 2016 || y == 2016 && m > 8 || y == 2016 && m == 8 && d > 7)
{
day = Date(y, m, d, 2016, 8, 7);
weeki = day % 7;
return weeki;
}
else
{
day = Date(y, m, d, 2016, 8, 7);
weeki = 7 - day % 7;
if (weeki == 7)
weeki = 0;
return weeki;
}
}
int main()
{
int y, d;
char m[20];
char week[7][20] = { "Sunany", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" };
while (cin >> d >> m >> y)
{
int month = exchange_month(m);
int weeki = Getweek(y, month, d);
cout << week[weeki] << endl;
}
system("pause");
return 0;
}
- 该方法就是在元来方法一的基础上添加了计算星期的一个函数int Getweek(int y, int m, int d),以某一个具体时间为参照,例如2016年8月7号为周日,以此为基准进行推算得到想要日期的星期名