OJ题:计算两个日期间的差值

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

输入:20110412 20110422 输出:11

思路一:将两个日期分别与其对应年的第一天相减,用得到的数据大的减去小的,最后就是相差的数值。

思路二:构造一个日期类,核心思想在重载d1-d2,并且复用operator++,小的日期数据自增来等于大的数据,自增次数就是差值。

这里先给出思路二的解法:代码如下。

// 测试程序的设计
int main()
{
    int date1,date2;// 两个字符串变量20110411  20110422
    int year1,month1,day1,year2,month2,day2;
    while(cin >> date1 >> date2)
    {
        //date1=20230125 date2=20230126
        year1 = date1 / 10000,month1 = date1 % 10000 / 100,day1 = date1 % 100000;
        year2 = date2 / 10000,month2 = date2 % 10000 / 100,day2 = date2 % 100000;
        Data d1(year1,month1,day1);
        Data d2(year2,month2,day2);
        cout << d1 - d2 << " ";
    }
}
// d1 - d2 的重载
int operator-(const Data& d2)
{
    // 假设d1大于d2
    Data max = d1;
    Data min = d2;
    int flag = 1;
    if(*this < d2)
    {
        max = d2;
        min = d1;
        flag = -1;
    }
    
    // 小的日期自增来与大的相等,给出自增次数就是两个日期的差值
    int count = 0;// 自增次数
    while(min != max)
    {    
        ++count; 
        ++min;
    }
    return count*flag;
}
// 实现了operator-的重载,我们还需要实现小于,不等于,自增,加等的重载
Data& operator+=(int day)// d1+=某个数
{
    _day = _day + day;
    while(_day > getmonthday(_year,_month))
    {
        ++_month;
        _day = _day - getmonthday(_year,_month);
        if(_month == 13)
        {
            ++_year;
            _month = 1;
        }
    }
    return *this;
}
bool operator>(const Data& d2)
{
    if(_year > d2._year)
        return true;
    else if(_year == d2._year && _month > d2._month)
        return true;
    else if(_year == d2._year && _month == d2._month && _day > d2._day)
        return true;
    else
        return false;
}
bool operator<(const Data& d2)
{
    if(_year < d2._year)
        return true;
    else if(_year == d2._year && _month < d2._month)
        return true;
    else if(_year == d2._year && _month == d2._month && _day < d2._day)
        return true;
    else
        return false;
}
bool operator!=(const Data& d2)
{
    return (_year != d2._year
        && _month != d2._month
        && _day != d2._day);
}
bool operator==(const Data& d2)
{
    return (_year == d2._year
        && _month == d2._month
        && _day == d2._day);
}
Data& operator++()// 前置++
{
    *this += 1;
    return *this;
}    
// 获取12个月中某一个月有几天
int getmonthday(int year,int month)
{
    int month_day[] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
    if((month == 2) && (year % 4 == 0 %% year % 100 !=0) || (year % 400 == 0))
    {
        return 29;
    }
    else
        return month_day[month];
}
// data的构造函数
Data(int year = 1,int month = 1,int day = 1)
{
    if(year >= 1 && month >= 1 && month <=12 && day >= 1 && day <= getmonthday(year,month))
    {
        _year = year;
        _month = month;
        _day = day;
    }
    else
        count << "输入不合法" << "endl";
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值