C++中日期类的常见题目合集分享

来自:网络
时间:2023-07-24
阅读:
目录

求1+2+3+…+n

题目:

求1+2+3+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。

数据范围: 0<n≤200

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

示例1:

输入:5
返回值:15

示例2:

输入:1
返回值:1

思路一:

根据我们刚学的内部类的方法进行求解,通过调用n次构造函数来计算和,从_i = 1开始计算,每调用一次构造函数_i++一次,一共调用n次构造函数,也就计算出1+2+……+n。

代码一:使用内部类和静态成员变量的方法

#include <unistd.h>
class Solution {
public:
class Sum{
public:
    Sum()
    {
        _sum += _i;
        _i++;
    }
};
    int Sum_Solution(int n) {
        Sum a[n];
        return _sum;
    }
private:
    static int _i;
    static int _sum;
};
int Solution::_i = 1;
int Solution::_sum = 0;

代码二:使用静态成员函数和静态成员变量

class Sum{
public:
    //构造函数
    Sum()
    {
        _sum += _i;
        _i++;
    }
    //对静态成员变量初始化
    static void Init()
    {
        _i = 1;
        _sum = 0;
    }
    //获取成员变量的值
    static int GetSum()
    {
        return _sum;
    }
private:
    static int _i;
    static int _sum;
};
class Solution {
public:
    int Sum_Solution(int n) {
        Sum::Init();
        //Sum a[n];//变长数组
        Sum* p = new Sum[n];
        return Sum::GetSum();
    }
};
//静态成员变量的定义
int Sum::_i = 1;
int Sum::_sum = 0;

时间复杂度:O(1)

空间复杂度:O(N)

计算日期到天数转换

题目:

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

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

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

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

输出描述:输出是这一年的第几天

示例1:

输入:2012 12 31
输出:366

示例2:

输入:1982 3 4
输出:63

思路一:

将每个月的天数使用数组存储起来,然后将前n-1个月份的天数相加再加上第n月的天数即是总的天数。此外要注意2月份的天数变化。

代码:

#include <iostream>
using namespace std;
int GetDay(int year, int month)
{
    //将每个月的天数存储起来
    int monthday[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
    //当月份为2月且为闰年时2月份有29天
    if (month == 2)
    {
        if ((year % 400 == 0) || (year % 4 == 0 && year % 100 != 0))
        {
            return monthday[month] + 1;
        }
    }
    return monthday[month];
}
int main() {
    int year;
    int day;
    int month;
    cin >> year >> month >> day;
    if (year < 1000 || year > 9999 || month > 13 || day <= 0 || day > GetDay(year,month) )
    {
        exit(0);
    }
    int sum = 0;
    //将前n-1月的天数相加
    while (month--)
    {
        sum += GetDay(year, month);
    }
    //加上本月的天数
    sum += day;
    cout << sum << endl;
    return 0;
}

时间复杂度:O(N)

空间复杂度:O(1)

思路二:

直接将前n个月份合计天数放到数组中,然后计算。

代码:

#include <iostream>
using namespace std;
int GetDay(int year,int month)
{
    //将前n个月的天数之和算出来
    int arr[12]={0,31,59,90,120,151,181,212,243,273,304,334};
    //判断是否是闰年
    if((month >= 2) && (year % 400 == 0 || year%4 == 0 && year %100 != 0))
    {
        return arr[month]+1;
    }
    return arr[month];
}
int main() {
    int year,month,day;
    cin >> year >> month >> day;
    //计算总共的天数
    int num = GetDay(year, month-1) + day;
    cout << num << endl;
    return 0;
}

时间复杂度:O(1)

空间复杂度:O(1)

日期差值

题目:

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

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

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

示例1:

输入:20110412
    20110422
输出:11

思路一:

当我们要计算同年同月不同天的日期差值时,只需要相减之后再加1即可;计算同年不同月的日期,先将小日期的当月天数加进去然后再计算日期之间的差值;不同年的时候直接按照年的天数相加直至年份相等,然后再进行月份相隔天数的计算。

代码:

#include <iostream>
using namespace std;
//获取月份天数
int GetDay(int year, int month) {
    int monthday[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
    if (month == 2) {
        if (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)) {
            return monthday[month] + 1;
        }
    }
    return monthday[month];
}
int main() {
    int n1;
    int n2;
    while (cin >> n1 >> n2) {
        //确保日期n1小于日期n2
        if(n1 > n2)
        {
            int tmp = n1;
            n1 = n2;
            n2 = tmp;
​​​​​​​        }
        //将日期按照年月日分割
        int day1 = n1 % 100;
        int day2 = n2 % 100;
        n1 = n1 / 100;
        n2 = n2 / 100;
        int month1 = n1 % 100;
        int month2 = n2 % 100;
        n1 = n1 / 100;
        n2 = n2 / 100;
        int year1 = n1;
        int year2 = n2;
        //当年月日都相同时返回0
        if (year1 == year2 && month1 == month2 && day1 == day2)
            cout << "0" << endl;
        //当年月相同日不同时返回
        else if (year1 == year2 && month1 == month2)
            cout << (day2 - day1) + 1 << endl;
        //当年相同其他都不相同时
        else if (year1 == year2) {
            int sum = 0;
            while (month1 != month2) {
                sum += GetDay(year1, month1);
                month1++;
            }
            sum = sum + day2 - day1 + 1;
            cout << sum << endl;
        } 
        //当年月日都不相同时
        else {
            int sum = 0;
            while (year1 != year2) {
                if (year1 % 400 == 0 || (year1 % 4 == 0 && year1 % 100 != 0)) {
                    sum += 366;
                } else {
                    sum += 365;
                }
                year1++;
            }
            while (month1 != month2) {
                sum += GetDay(year1, month1);
                month1++;
            }
            sum = sum + day2 - day1 + 1;
            cout << sum << endl;
        }
    }
    return 0;
}

时间复杂度:O(N)

空间复杂度:O(1)

打印日期

题目:

给出年分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

思路:

将每个月的天数存到数组中,按照1月份开始往后计算。

代码:

#include <iostream>
using namespace std;
int main() {
    int year,n;
    int monthday[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
    while(cin >> year >> n)
    {
        int month = 1;//month从1月份开始
        int day = n;
        //判断是否是闰年
        if ((year % 400 == 0) || (year % 4 == 0 && year % 100 != 0)) {
            monthday[2] += 1;//闰年2月份为29天
        }
        //判断天数
        while(day > monthday[month])
        {
            day = day - monthday[month];
            month++;
        }
        printf("%d-%02d-%02d\n", year, month, day);
    }
    return 0;
}

时间复杂度:O(N)

空间复杂度:O(1)

日期累加

题目:

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

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

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

示例:

输入:
1
2008 2 3 100
输出:
2008-05-13

思路:

先将日期和要累加的天数相加然后通过比较当月日期是否合法,逐渐向后减。

代码:

#include <iostream>
using namespace std;
//获取当前月份的天数
int GetDay(int year, int month)
{
   int monthday[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
    //当月份为2月且1是闰年时2月份有31天
   if(month == 2)
   {
        if ((year % 400 == 0) || (year % 4 == 0 && year % 100 != 0)) {
            return monthday[month]+1;
        }
   }
   return monthday[month];
}
int main() {
    int m = 0;
    cin >> m;
    for(int i = 0; i < m; i++)
    {
        int year,month,day,n;
        while(cin >> year >> month >> day >> n)
        {
            day = day + n;
            while(day > GetDay(year, month))
            {
                day = day - GetDay(year, month);
                month++;
                if(month > 12)
                {
                    year++;
                    month = 1;
                }
            }
            printf("%d-%02d-%02d\n",year,month,day);
        }
    }
}

时间复杂度:O(N)

空间复杂度:O(1)

以上就是C++中日期类的常见题目合集分享的详细内容,更多关于C++日期类的资料请关注其它相关文

返回顶部
顶部