Day05 日期类OJ题目

计算日期到天数转换_牛客题霸_牛客网根据输入的日期,计算是这一年的第几天。 保证年份为4位数且日期合法。 进阶:时。题目来自【牛客题霸】icon-default.png?t=O83Ahttps://www.nowcoder.com/share/jump/4938575031726974727572

根据输入的日期,计算是这一年的第几天。

保证年份为4位数且日期合法。

进阶:时间复杂度:O(n) O(n) ,空间复杂度:O(1) O(1) 

输入描述:

输入一行,每行空格分割,分别是年,月,日

输出描述:

输出是这一年的第几天

#include <iostream>
using namespace std;

bool IsLeapYear(int year) // 闰年判断
{
    if(((year%4 == 0 && 0 != year%100) || (0 == year%400)))
        return true;
    return false;
}

int GetDayofYear(int year, int month, int day)
{
    int days = 0;   // 用于返回结果
    int DayOfMonth[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
    for(int i = 1; i < month; i++) // 将当前月份之前所有day加上
    {
        days += DayOfMonth[i];
        if(i == 2 && IsLeapYear(year))  // 若是闰年 加一天
            days+=1;
    }
    days += day;
    return days;
}

int main() 
{
    int year, month, day;
    while(cin>>year>>month>>day)
    {
        cout << GetDayofYear(year, month, day) <<endl;
    }
    return 0;   
}

日期差值_牛客题霸_牛客网有两个日期,求两个日期之间的天数,如果两个日期是连续的我们规定他们之间的天数为两天。题目来自【牛客题霸】icon-default.png?t=O83Ahttps://www.nowcoder.com/share/jump/4938575031726976288481

描述

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

输入描述:

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

输出描述:

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

示例1

输入:

20110412
20110422

输出:

11
#include <iostream>
using namespace std;

class Date
{
    public:
        bool Isleap(int year)
        {
            if((year%4==0 && year%100!=0) || year%400==0)
            return true;
            else
            return false;
        }
        int Getday(int year, int month)
        {
            int arr[13] = {0, 31, 28, 31,30,31,30,31,31,30,31,30,31};
            int day = arr[month];
            if(Isleap(year) && month == 2)
            day += 1;
            return day;
        }
        Date(int year = 2022, int month = 12, int day = 8)
            : _year(year)
            , _month(month)
            , _day(day)
        {
            if(!((year>0) && (month>0 && month<=12) && (day>0 && day<=Getday(year, month))))
            {
                cout<<"输入的日期不正确,即将将日期重新初始化为默认日期"<<endl;
                _year = 2022;
                _month = 12;
                _day = 8;
            }
        }

        Date(const Date& d)
        {
            _year = d._year;
            _month = d._month;
            _day = d._day;
        }

        // Date operator+(int day)
        // {
        //     Date temp(*this);
        //     temp._day += day;
        //     int GetDay = 0;
        //     while(temp._day > (GetDay = Getday(temp._year, temp._month)))
        //     {
        //         temp._day -= GetDay;
        //         temp._month += 1;
        //         if(temp._month == 13)
        //         {
        //             temp._month = 1;
        //             temp._year += 1;
        //         }
        //     }
        //     return temp;
        // }
        Date operator+(int day)
	{
		// 因为 + 不改变左右参数的值,所以可以使用一个临时变量来存储并返回所得的结果。
		Date temp(*this);
		temp._day += day;
		// 当这个天数不合法时循环继续
		int Daysofmonth = 0;
		while (temp._day >  (Daysofmonth = Getday(temp._year, temp._month)))
		{
			// _day 减去本月的天数
			temp._day -= Daysofmonth;
			// _month 后移一月
			temp._month += 1;
			// 对月数格式检测是否合法,如果到13月了 直接转入1月
			if (temp._month == 13)
			{
				temp._month = 1;
				temp._year += 1;
			}
		}
		return temp;
	}
        bool operator>(Date d)
        {
            if(_year>d._year || (_year==d._year && _month>d._month) || (_year==d._year && _month==d._month && _day>d._day))
            return true;
            else
            return false;
        }

        bool operator==(Date d)
        {
            return (_year==d._year && _month==d._month && _day==d._day);
        }

        bool operator!=(Date d)
        {
            return !(*this==d);
        }

        // int operator-(Date d)
        // {
        //     Date maxdate(*this);
        //     Date mindate(d);
        //     if(mindate>maxdate)
        //     {
        //         maxdate = d;
        //         mindate = *this;
        //     }
        //     int count = 0;
        //     while(maxdate != mindate)
        //     {
        //         mindate = mindate + 1;
        //         count++;
        //     }
        //     return count;
        // }
        int operator-(const Date& d)
	{
		Date maxdate(*this);
		Date mindate(d);
		if (mindate > maxdate)
		{
			maxdate = d;
			mindate = *this;
		}
		int count = 0;
		while (mindate != maxdate)
		{
			count++;
			mindate = mindate + 1;
		}
		return count;
	}
    private:
        int _year;
        int _month;
        int _day;
};

int main() {
    // char s1[8], s2[8];
    // cin>>s1>>s2;
    // char s1_year[4], s2_year[4];
    // for(int i = 0; i < 4; ++i)
    // {
    //     s1_year[i] = s1[i];
    //     s2_year[i] = s2[i];
    // }
    // char s1_month[2], s2_month[2];
    // for(int i = 4; i < 6; ++i)
    // {
    //     s1_month[i] = s1[i];
    //     s2_month[i] = s2[i];
    // }
    // char s1_day[2], s2_day[2];
    // for(int i = 4; i < 6; ++i)
    // {
    //     s1_day[i] = s1[i];
    //     s2_day[i] = s2[i];
    // }
    // Date d1(atoi(s1_year), atoi(s1_month), atoi(s1_day));
    // Date d2(atoi(s2_year), atoi(s2_month), atoi(s2_day));
    int time1,y1,m1,d1;
    int time2,y2,m2,d2;
    scanf("%d%d",&time1,&time2);
    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;
    Date D1(y1, m1, d1);
    Date D2(y2, m2, d2);
    int day = D1 - D2;
    cout<<day+1<<endl;

}
// 64 位输出请用 printf("%lld")

 打印日期_牛客题霸_牛客网给出年分m和一年中的第n天,算出第n天是几月几号。。题目来自【牛客题霸】icon-default.png?t=O83Ahttps://www.nowcoder.com/share/jump/4938575031726985648236

描述

给出年分m和一年中的第n天,算出第n天是几月几号。

输入描述:

输入包括两个整数y(1<=y<=3000),n(1<=n<=366)。

输出描述:

可能有多组测试数据,对于每组数据, 按 yyyy-mm-dd的格式将输入中对应的日期打印出来。

示例1

输入:

2000 3
2000 31
2000 40
2000 60
2000 61
2001 60

输出:

2000-01-03
2000-01-31
2000-02-09
2000-02-29
2000-03-01
2001-03-01
#include <iostream>
using namespace std;
#include <stdio.h>

bool Isleap(int year) 判断闰年
        {
            if((year%4==0 && year%100!=0) || year%400==0)
            return true;
            else
            return false;
        }

int getday(int year, int month)    获取该年该月天数
{
    int arr[13] = {0, 31, 28, 31,30,31,30,31,31,30,31,30,31};
    int day = arr[month];
    if(month == 2 && Isleap(year))
        return day+1;
    else
        return day;
}

int main() {
    int _year, _day;
    while (scanf("%d %d", &_year, &_day) != EOF) { 
        int month = 1;
        int day = getday(_year, month); 用给出的_day每次减去当月
        while(_day > day)               若_day小于day则就在该月
        {                            否则就是在后面月份,更新_day 和 month
            _day -= day;
            month++;
            day = getday(_year, month);
        }
        printf("%d-%02d-%02d\n", _year, month, _day);
    }
    return 0;
}
// 64 位输出请用 printf("%lld")

日期累加_牛客题霸_牛客网设计一个程序能计算一个日期加上若干天后是什么日期。。题目来自【牛客题霸】icon-default.png?t=O83Ahttps://www.nowcoder.com/share/jump/4938575031726985933191

描述

设计一个程序能计算一个日期加上若干天后是什么日期。

输入描述:

输入第一行表示样例个数m,接下来m行每行四个整数分别表示年月日和累加的天数。

输出描述:

输出m行,每行按yyyy-mm-dd的个数输出。

示例1

输入:

1
2008 2 3 100

输出:

2008-05-13
#include <iostream>
using namespace std;
#include<stdio.h>

bool Isleapyear(int year)
{
    if((year%4==0 && year%100!=0) || year%400==0)
    return true;
    return false;
}

int GetDay(int year, int month)
{
    int arr[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
    int day = arr[month];
    if(Isleapyear(year) && month==2)
    return day+1;
    else
    return day;
}

void Date(int _year, int _month, int _day, int day)
{
    _day += day;
    while(_day > GetDay(_year, _month))
    {
        _day-=GetDay(_year, _month);
        _month+=1;
        if(_month==13)
        {
            _year+=1;
            _month=1;
        }
    }
    printf("%d-%02d-%02d\n", _year,_month,_day);
}

int main() {
    int n,_year,_month,_day,day;
    cin>>n;
    for(int i = 0; i < n; ++i)
    {
        cin>>_year>>_month>>_day>>day;
        Date(_year,_month,_day,day);
    }
}
// 64 位输出请用 printf("%lld")

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值