【Code Up 问题 A】:日期差值

模拟题介绍

入门模拟题 分为简单模拟,查找元素,图形输出,日期处理,进制转换,字符串处理等等!

何为模拟题?

模拟题是一类“题目怎么说,你就怎么做的”的一类题目。此类题目不涉及算法,完全根据题目描述进行代码的编写,主要考察代码能力!!!

今天讲述一道模拟题 —— 日期处理

大家应该知道日期,时间等等的转换处理有些许麻烦的。
时间些许好一些,但比如日期需要考虑闰平年,每个月是否是大小月等等…

【Code Up 问题 A】:日期差值

题目描述

有两个日期,求两个日期之间的天数,如果两个日期是连续的我们规定他们之间
的天数为两天。

输入

有多组数据,每组数据有两行,分别表示两个日期,形式为YYYYMMDD

输出

每组数据输出一行,即日期差值

样例输入 Copy

20130101
20130105

样例输出 Copy

5

题意:

多组测试用例,每组测试用例输入两个日期,日期输入样式如上。结果输出两个日期之间的差值!!!

看到此时脑子是否在高速运转呢?

1,你是否是采用结构体然后定义两个结构体变量输入数据并采用
scanf ("%4d%2d%2d", ..........)

2,你是否采用的思路是结构体变量a 和 结构体变量b 两者相减得出天数。
(相减当然没错,复杂度可想而知,需要考虑很多!)

3,闰平年是否直接判断,大小月又是否直接判断?

好吧!以上的思路都是错的,都是非常繁琐的(最后不一定Accept)

提供一个简单易行思路:

将最小日期天数不断的加1,直到加到并且等于大日期,中间走过的天数即是差值。

C++代码

include <cstdio>
bool isLeap(int year)//润平年判断,真返回1, 否返回0
{
    return ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0));
}
int month[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}};
//定义二维数组,第一维放平年,第二维放闰年
//行数定义13目的使一月直接对应month[1][x],更加直观
int main()
{
    int time1, y1, m1, d1;
    int time2, y2, m2, d2;
    //由于日期始终为6位数,可以用整型变量来表示
    while (scanf("%d%d", &time1, &time2) != EOF) {
        if (time1 > time2) {//始终保持小日期在前,大日期在后
        	int temp = time1;
            time1 = time2;
            time2 = temp;
        }
        y1 = time1/ 10000; m1 = time1 % 10000 / 100, d1 = time1 % 100;
        y2 = time2/ 10000; m2 = time2 % 10000 / 100, d2 = time2 % 100;
        //将日期的大数换为日期
        int ans = 1;//天数统计变量
        while (y1 < y2 || m1 < m2 || d1 < d2) {
        //在y1 == y2 ,m1 == m2, d1 == d2 时结束循环,否则继续循环
            d1++;
            if ( d1 == ( month[m1][isLeap(y1)] + 1) )//这里体现啦二维数组的优越啦
            {
                m1++;
                d1 = 1;
            }
            if (m1 == 13)
            {
                y1++;
                m1 = 1;
            }
            //以上if条件里是天数变换和月数以及年数的不断变换
            ans++;
        }
        printf("%d\n", ans);//最终打印差值天数
    }
    return 0;
}

©️2020 CSDN 皮肤主题: 岁月 设计师:pinMode 返回首页