日期类问题

版权声明:本文为博主原创文章 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号为周日,以此为基准进行推算得到想要日期的星期名

猜你喜欢

转载自blog.csdn.net/snowy19130140/article/details/52133121