| 注册
请输入搜索内容

热门搜索

Java Linux MySQL PHP JavaScript Hibernate jQuery Nginx
cey6
10年前发布

C++ 求两日期间相隔天数

    #include <iostream>        #include <algorithm>        #include <cmath>                using namespace std;                struct Date{            int year;            int month;            int day;                    Date(int y = 0, int m = 0, int d = 0):                year(y), month(m), day(d) {}                    Date & readIn() {                cin >> year >> month >> day;                return *this;            }                    void swap(Date & rhs) {                Date t(*this);                *this = rhs;                rhs = t;            }                };                bool is_leap(int year) {            return (year % 400)|| (year % 4 && year % 100);        }                bool operator < (const Date & lhs, const Date & rhs) {            return (lhs.year < rhs.year) ||                    (lhs.year == rhs.year) && (lhs.month < rhs.month) ||                    (lhs.year == rhs.year) && (lhs.month == rhs.month && lhs.day < rhs.day);        }                int days_of_month(int year,int month) {            switch(month) {            case 1: case 3: case 5:case 7:            case 8: case 10: case 12:                return 31;            case 2:                return is_leap(year) ? 29: 28;                    case 4: case 6: case 9: case 11:                return 30;            default:                return -1;            }        }                int day_diff(Date lhs, Date rhs) {        <span style="white-space:pre">    </span>//通过不断用其中一个向另一个逼近来求相差天数            int flag = 1;            if(rhs < lhs) {                swap(lhs, rhs);                flag = -1;            }                    int day_shf = 0;            if(lhs.day < rhs.day) {                day_shf += rhs.day - lhs.day;                rhs.day = lhs.day;            }            if(lhs.day > rhs.day) {                day_shf -= lhs.day - rhs.day;                lhs.day = rhs.day;            }                    while(lhs.month < rhs.month) {                day_shf += days_of_month(lhs.year ,lhs.month);                ++lhs.month;            }            while(lhs.month > rhs.month) {                day_shf -= days_of_month(rhs.year ,rhs.month);                ++rhs.month;            }        <span style="white-space:pre">    </span>//两个日期始终以相互为界,故日期大小关系不可能改变            while(lhs.year < rhs.year) {                day_shf += is_leap(lhs.year) ? 366: 365;                ++lhs.year;            }                    return day_shf*flag;        }                        int main()        {            Date d1, d2;            while(true) {                d1.readIn(); d2.readIn();                cout << day_diff(d1, d2) << endl;            }            return 0;        }