C++类相关oj题目分享(计算日期到天数转换、日期差值、打印日期、日期累加)

简介: C++类相关oj题目分享(计算日期到天数转换、日期差值、打印日期、日期累加)

1.计算日期到天数转换


题目详情

代码

#include <iostream>
using namespace std;
int GetDay(int year,int month)
{
    int DayOfMonth[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
    if(month==2&&(year%400==0||(year % 4 == 0 && year % 100 )) )
    {
        return 29;
    }
    return DayOfMonth[month];
}
int main() {
    int year;
    int month;
    int day;
    cin>>year>>month>>day;
    int sum=0;
    for(int i=1;i<month;i++)
    {
        sum+=GetDay(year, i);
    }
    cout<<sum+day;
}


思路

首先我们知道肯定是用一个数组来储存每个月的天数,更加方便。同时默认2月是28天,如果是闰年就是29。

总体的计算思路是:1月到month-1月的所有天数,加上month月的day。使用for循环能正好契合这个思路

当然这题的思路和解法非常多,我这也只是其中一个。


2.KY111 日期差值


题目详情

代码

int GetDay(int year, int month) {//返回一年中哪一个月的天数
    int DayOfMonth[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    if (month == 2 && (year % 400 == 0 || (year % 4 == 0 && year % 100 )) ) {
        return 29;
    }
    return DayOfMonth[month];
}
int Sum(int a, int b) {
    int max = b;
    int min = a;
    int flag = 1;
    if (a > b) {
        flag = -1;
        max = a;
        min = b;
    }
    int day1 = min % 100;
    int month1 = (min / 100) % 100;
    int year1 = min / 10000;
    int day2 = max % 100;
    int month2 = (max / 100) % 100;
    int year2 = max / 10000;
    int count = 1;
    while ((year1 < year2) || (month1 < month2) || (day1 < day2)) {
        day1++;
        if (day1 > GetDay(year1, month1)) { //如果满了当月天数
            month1++;//跳到下一个月,天数变为1号
            day1 = 1;
        }
        if (month1 == 13) { //如果满了当年月数
            year1++;//跳到下一年,月数变为1月
            month1 = 1;
        }
        count++;
    }
    return flag * count;
}
int main() {
    int a, b;
    while (cin >> a >> b) {
        cout << Sum(a, b) << endl;
    }
    return 0;
}
}


思路


首先我们要处理连续输入,之前是使用while(scanf(…)!=EOF)

现在也可以,但毕竟是c++。可以用while(cin<<…)

因为:例如上面,当使用 while(cin >> a >> b) 时,如果输入操作成功(即用户输入了两个整数),cin 的布尔值为 true,循环会继续执行。如果输入操作失败(例如遇到文件结束符。在 Windows 中是 Ctrl+Z,Linux/macOS 中是 Ctrl+D。这样程序会结束循环并终止执行),cin 的布尔值为 false,循环会终止

思路是找到二者中较小的,再进行拆分。根据只要二者不相等,day1(较小的)就++;天数满了,月满了再进行处理。每一次count++。


3.KY222 打印日期


题目详情

代码

#include <iostream>
using namespace std;
int main() {
    int year, sum_day;
    while (cin >> year >> sum_day) {
        // 注意 while 处理多个 case
        int DayOfMonth[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
        if (year % 400 == 0 || (year % 4 == 0 && year % 100 )) 
        {
            DayOfMonth[2]++;
        }
        int month=1;
        while(sum_day>DayOfMonth[month])
        {
            sum_day-=DayOfMonth[month];
            ++month;
            if(sum_day==DayOfMonth[month])
            {
                ++month;
                sum_day=1;
                break;
            }
        }
        printf("%d-%02d-%02d",year,month,sum_day);
    }
}


4.KY258 日期累加


题目详情

代码

#include <cfloat>
#include <iostream>
using namespace std;
int GetDay(int year, int month) //返回一年中哪一个月的天数
{
    int DayOfMonth[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    if (month == 2 && (year % 400 == 0 || (year % 4 == 0 && year % 100 )) ) 
    {
        return 29;
    }
    return DayOfMonth[month];
}
    int main() 
    {
        int num;
        cin>>num;
        while (num--) 
        {
            int year, month, day,add_day;
            cin >> year >> month >> day>>add_day;
            while(add_day--)
            {
                ++day;
                if (day > GetDay(year, month))
                {
                    ++month;
                    day=1;
                }
              if(month==13)
               {
                  year++;
                 month=1;
               } 
             }
            printf("%d-%02d-%02d\n",year,month,day);
        }
        return 0;
    }


思路

这题大家要注意题目的输入和输出要求,我自己在这上面浪费了好多多少。

目录
相关文章
|
1天前
|
存储 编译器 C语言
【c++丨STL】string类的使用
本文介绍了C++中`string`类的基本概念及其主要接口。`string`类在C++标准库中扮演着重要角色,它提供了比C语言中字符串处理函数更丰富、安全和便捷的功能。文章详细讲解了`string`类的构造函数、赋值运算符、容量管理接口、元素访问及遍历方法、字符串修改操作、字符串运算接口、常量成员和非成员函数等内容。通过实例演示了如何使用这些接口进行字符串的创建、修改、查找和比较等操作,帮助读者更好地理解和掌握`string`类的应用。
14 2
|
7天前
|
存储 编译器 C++
【c++】类和对象(下)(取地址运算符重载、深究构造函数、类型转换、static修饰成员、友元、内部类、匿名对象)
本文介绍了C++中类和对象的高级特性,包括取地址运算符重载、构造函数的初始化列表、类型转换、static修饰成员、友元、内部类及匿名对象等内容。文章详细解释了每个概念的使用方法和注意事项,帮助读者深入了解C++面向对象编程的核心机制。
33 5
|
14天前
|
存储 编译器 C++
【c++】类和对象(中)(构造函数、析构函数、拷贝构造、赋值重载)
本文深入探讨了C++类的默认成员函数,包括构造函数、析构函数、拷贝构造函数和赋值重载。构造函数用于对象的初始化,析构函数用于对象销毁时的资源清理,拷贝构造函数用于对象的拷贝,赋值重载用于已存在对象的赋值。文章详细介绍了每个函数的特点、使用方法及注意事项,并提供了代码示例。这些默认成员函数确保了资源的正确管理和对象状态的维护。
45 4
|
15天前
|
存储 编译器 Linux
【c++】类和对象(上)(类的定义格式、访问限定符、类域、类的实例化、对象的内存大小、this指针)
本文介绍了C++中的类和对象,包括类的概念、定义格式、访问限定符、类域、对象的创建及内存大小、以及this指针。通过示例代码详细解释了类的定义、成员函数和成员变量的作用,以及如何使用访问限定符控制成员的访问权限。此外,还讨论了对象的内存分配规则和this指针的使用场景,帮助读者深入理解面向对象编程的核心概念。
43 4
|
1月前
|
存储 编译器 对象存储
【C++打怪之路Lv5】-- 类和对象(下)
【C++打怪之路Lv5】-- 类和对象(下)
28 4
|
1月前
|
编译器 C语言 C++
【C++打怪之路Lv4】-- 类和对象(中)
【C++打怪之路Lv4】-- 类和对象(中)
25 4
|
1月前
|
存储 安全 C++
【C++打怪之路Lv8】-- string类
【C++打怪之路Lv8】-- string类
22 1
|
1月前
|
存储 编译器 C++
【C++类和对象(下)】——我与C++的不解之缘(五)
【C++类和对象(下)】——我与C++的不解之缘(五)
|
1月前
|
编译器 C++
【C++类和对象(中)】—— 我与C++的不解之缘(四)
【C++类和对象(中)】—— 我与C++的不解之缘(四)
|
1月前
|
C++
C++番外篇——对于继承中子类与父类对象同时定义其析构顺序的探究
C++番外篇——对于继承中子类与父类对象同时定义其析构顺序的探究
54 1