機試:日期差值(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;
}


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