机试:日期差值(2009年上海交通大学计算机研究所机试真题)

题目描述:

1116: 日期差值

时间限制: 1 Sec
内存限制: 32 MB
提交: 2
解决: 2
提交状态
题目统计
提交代码
题目描述

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

 

输入

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

 

输出

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

 

样例输入
20130101
20130105
 

样例输出
5
  

(1)思路:对于时期问题设置一个公共起点本题为00000101(0000年01月01日),用全局变量来存储每一天到距离起始天的天数。

C++代码实现:

#include <stdio.h> 

#define ISLEAPYEAR(x) x % 100 != 0 && x % 4 == 0 || x % 400 == 0 ? 1 : 0 //用宏判断是否为运年

using namespace std;
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][ISLEAPYEAR(Year)]) {  //超过该月的最大天数月数+1 
            Day = 1;
            Month++;
            if (Month > 12) {  //超过12个月年数+1 
                Month = 1;
                Year++;
            }
        }     
    }
};

int buf[5001][13][32]; //保存预处理天数

int Abs(int x) { //去绝对值 
    return x > 0 ? x : -x;
} 

int main() {
    Date date;
    int count_day = 0; //用于统计天数
    date.Day = 1;
    date.Month = 1;
    date.Year = 0;    //Day Month Year 初始化
    while (date.Year != 5001) {
        buf[date.Year][date.Month][date.Day] = count_day;
        date.nextDay();
        count_day++;
    } 
    int y1, m1, d1; //用于接收第一个数据 
    int y2, m2, d2; //用于接收第二个数据
    while (scanf("%4d%2d%2d", &y1, &m1, &d1) != EOF) {
        scanf("%4d%2d%2d", &y2, &m2, &d2);
        printf("%d\n", Abs(buf[y2][m2][d2] - buf[y1][m1][d1]) + 1);
    } 
    return 0;
} 
(2)另一种思路:计算出该日期到该年初有多少天,然后加上该年以前的年份每年多少天

C++代码实现:

#include <stdio.h>
#include <stdlib.h>

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}};// 运年特殊处理 
bool isLeapYear(int y) { //判断是否运年 
    if(y % 4 == 0 && y % 100 != 0 || y % 400 == 0) 
        return true;
    else
        return false;
}
int days(int y, int m, int d) { //当前日期到本月初一共多少天
    int day = 0, j = 0;
    if(isLeapYear(y)) j = 1;
    for(int i = 1; i < m; i++) {
        day += dayOfMonth[i][j];
    }
     return day + d;
}
int main() {
    int y1, y2, m1, m2, d1, d2, count1, count2;
    count1 = count2 = 0;
    while(scanf("%4d%2d%2d", &y1, &m1, &d1) != EOF) {
        scanf("%4d%2d%2d", &y2, &m2, &d2);
        for(int i = 0; i < y1; i++) {
            if(isLeapYear(y1)) {
                count1 += 366;
            } else 
            count1 += 365;
        }
        count1 += days(y1, m1, d1);
        for(int i = 0; i < y2; i++) {
            if(isLeapYear(y2)) {
                count2 += 366;
            } else  count2 += 365;
        }
        count2 += days(y2, m2, d2);
        printf("%d\n", abs(count1 - count2) + 1);
    }
    return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章