日期类相关练习题

news2025/1/16 17:13:59

在这里插入图片描述

前言

本文记录一些有关日期类的oj题题解,实现过日期类小项目的可以练一下手,本文不做过多讲解.

目录

  • 前言
  • 一、求1+2+3+...+n
    • 题目介绍:
    • 解题思路:
    • 代码实现:
  • 二、计算日期到天数转换
    • 题目介绍:
    • 解题思路:
    • 代码实现:
  • 三、日期累加
    • 题目介绍:
    • 解题思路:
    • 代码实现
  • 四、日期差值
    • 题目介绍
    • 代码实现:
  • 五、打印日期
    • 题目介绍
    • 代码实现:

一、求1+2+3+…+n

题目来源于:牛客
题目链接:传送门

题目介绍:

1+2+3+...+n,要求不能使用乘除法、forwhileifelseswitchcase等关键字及条件判断语句(A?B:C)。

示例1:

输入:5
返回值:15

示例2:

输入:1
返回值:1

解题思路:

利用每次创建对象会自动调用构造函数,创建两个静态成员变量.
变量1:count每次调用构造函数后+1.
变量2:sum记录每次cout相加的结果.
创建一个大小为n的对象数组,这样就会创建n个对象,调用n次构造函数.

代码实现:

写法1:(友元类)

class small_Solution{
public:
    friend class Solution;
    small_Solution()
    {
        count++;
        sum+=count;
    }
private:
    static int count;
    static int sum;
};
class Solution {
public:
    int Sum_Solution(int n) {
        small_Solution a[n];
        return small_Solution::sum;
    }
};

int small_Solution::count=0;
int small_Solution::sum=0;

使用内部类:

class Solution {
public:
    int Sum_Solution(int n) {
        small_Solution a[n];
        return Solution::sum;
    }
    class small_Solution{//内部类
    public:
        small_Solution()
        {
        //内部类是外部类的天生友元,可直接使用外部类的静态成员变量
            count++;
            sum+=count;
        }

};
private:
    static int count;
     static int sum;
};
int Solution::count=0;
int Solution::sum=0;

二、计算日期到天数转换

题目来源于:牛客网
题目链接:传送门

题目介绍:

根据输入的日期,计算是这一年的第几天。
保证年份为4位数且日期合法。

输入描述:

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

输出描述:

输出是这一年的第几天

示例1

输入:2012 12 31
输出:366

示例2

输入:1982 3 4
输出:63

解题思路:

  1. 先记录给出的day.
  2. 根据给出的yearmonth计算天数
  3. 将前面每个月的天数累加+day.

代码实现:

#include <iostream>
using namespace std;
int is_leap_year(int year) {
    if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {
        return 1;
    } else return 0;
}
int main() {
    int year = 0, moon = 0, day = 0;
    cin>>year>>moon>>day;
    int sum = day;
    int leap = is_leap_year(year);//判断是否是闰年
    int arr[13] = { 0,31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
    for (int i = 1; i < moon; i++) {
        sum += arr[i];
        if (i == 3 && leap == 1) {
            sum += 1;
        }
    }
   cout<<sum;
   return 0;
}

三、日期累加

题目来源于:牛客
题目链接:传送门

题目介绍:

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

输入描述:

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

输出描述:

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

解题思路:

这只是日期类中的一个接口而已,实现过日期类可以直接复用.

代码实现

#include <iostream>

using std::cin;
using std::cout;
using std::endl;

class Date {
public:
    // 全缺省的构造函数
    Date(int year=2023, int month=1, int day=1) {
        _year = year;
        _month = month;
        _day = day;
    }
    // 获取某年某月的天数
    int GetMonthDay(int year, int month) {
        int day[13] = { 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)) { //如果是闰年,且是2月
            day[2] = 29;
        }
        return day[month];
    }
    //打印日期类函数
    void Print() {
        printf("%d-%02d-%02d\n", _year, _month, _day);
    }
    // 日期+=天数
    Date& operator+=(int day) {
        if (day < 0) {
            return *this -= -day;//调用"-="的运算符重载
        }
        _day += day;
        while (_day > GetMonthDay(_year, _month)) { //如果超过当月天数
            _day -= GetMonthDay(_year, _month);
            _month++;
            if (_month > 12) {
                _month = 1;
                _year++;
            }
        }
        return *this;
    }
    Date& operator-=(int day) {
        if (day < 0) {
            return *this += -day;//调用"+="的运算符重载
        }
        _day -= day;
        while (_day <= 0) { //如果是负数
            _month--;
            if (_month <= 0) {
                _month = 12;
                _year--;
            }
            _day += GetMonthDay(_year, _month);
        }
        return *this;
    }
private:
    int _year;
    int _month;
    int _day;
};
int main()
{
    int num=0;
    cin>>num;
    while(num--)
    {
        int year=0,month=0,day=0,n=0;
        cin>>year>>month>>day>>n;
        Date d1(year,month,day);
        d1+=n;
        d1.Print();
    }
    return 0;
}

四、日期差值

题目来源于:牛客
题目链接:传送门

题目介绍

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

输入描述:

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

输出描述:

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

示例:
输入:

20110412
20110422

输出:

11

代码实现:

#include <iostream>
using namespace std;

class Date {
  public:
    //Date.cpp
    Date(int year, int month, int day) {
        _year = year;
        _month = month;
        _day = day;
    }
    int GetMonthDay(int year, int month) {
        int day[13] = { 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)) { //如果是闰年,且是2月
            day[2] = 29;
        }
        return day[month];
    }

    bool operator>(const Date& d) {
        if (_year > d._year) { //如果年大
            return true;
        }
        {
            if (_year == d._year) {
                if (_month > d._month) { //年相同,月大
                    return true;
                } else {
                    if (_day > d._day) { //入如果年月相同,日大
                        return true;
                    }
                    return false;//月小,或者日小和相等
                }
            }
            return false;//如果年小
        }
    }
    // 日期-日期 返回天数
    int operator-(const Date& d) {
        //小的日期一直++,加到和大的日期一样时,加了多少次就差多少天
        Date max = *this;
        Date min = d;
        int flag = 1;
        int n = 0;
        while (min != max) { //用n统计相差多少天
            ++min;
            ++n;
        }
        return n * flag;
    }
    // 前置++
    Date& operator++() {
        _day += 1;
        while (_day > GetMonthDay(_year, _month)) { //如果超过当月天数
            _day -= GetMonthDay(_year, _month);//则减去当月的天数
            //月份向后推一个月
            _month++;
            if (_month > 12) {
                _month = 1;
                _year++;
            }
        }
        return *this;
    }
    bool operator==(const Date& d) {
        if (_year == d._year &&
                _month == d._month &&
                _day == d._day
           ) {
            return true;
        }
        return false;
    }
    // !=运算符重载
    bool operator != (const Date& d) {
        return !(*this == d);
    }
  private:
    int _year;
    int _month;
    int _day;
};


int main() {
    int year1 = 0, month1 = 0, day1 = 0;
    int year2 = 0, month2 = 0, day2 = 0;
    scanf("%4d%2d%2d", &year1, &month1, &day1);
    scanf("%4d%2d%2d", &year2, &month2, &day2);
    Date d1(year1, month1, day1);
    Date d2(year2, month2, day2);
    int ret = 0;
    if (d1 > d2) {
        ret = d1 - d2;
    } else {
        ret = d2 - d1;
    }
    cout<<ret+1;
    return 0;
}

五、打印日期

题目来源于:力扣
题目链接:传送门

题目介绍

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

输入描述:

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

输出描述:

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

示例:
输入:

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;

class Date
{
public:
//Date.cpp
Date(int year=2023 , int month=1, int day=0)
{
	_year = year;
	_month = month;
	_day = day;
	//这里也就体现出了,成员变量前面'_'的好处,方便与参数区分
}
    int GetMonthDay(int year, int month)
{
	int day[13] = { 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))//如果是闰年,且是2月
	{
		day[2] = 29;
	}
	return day[month];
}

    // 日期+=天数
Date&  operator+=(int day)
{
	_day += day;
	while (_day > GetMonthDay(_year, _month))//如果超过当月天数
	{
		_day -= GetMonthDay(_year, _month);//通过调用GetMonthDay函数获取当月天数
		_month++;
		if (_month > 12)//月数超过12,则开始下一年
		{
			_month = 1;
			_year++;
		}
	}
	return *this;
}
    void print()
    {
        printf("%04d-%02d-%02d",_year,_month,_day);
    }

private:

	int _year;
	int _month;
	int _day;
};


int main() {
    int year=0,month=0,day=0;
    while(scanf("%d%d",&year,&day)==2)
    {
        Date d1(year);
        d1+=day;
        d1.print();
        cout<<endl;
    }
    return 0;
}

本篇文章只是记录刷题,并没有过多讲解,建议实现一下日期类.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/829561.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

W6100-EVB-PICO做DNS Client进行域名解析

前言 在上一章节中我们用W6100-EVB-PICO通过dhcp获取ip地址&#xff08;网关&#xff0c;子网掩码&#xff0c;dns服务器&#xff09;等信息&#xff0c;给我们的开发板配置网络信息&#xff0c;成功的接入网络中&#xff0c;那么本章将教大家如何让我们的开发板进行DNS域名解…

四、JVM-对象内存模型

Java对象内存模型 一个Java对象在内存中包括3个部分&#xff1a;对象头、实例数据和对齐填充 数据 内存 – CPU 寄存器 -127 补码 10000001 - 11111111 32位的处理器 一次能够去处理32个二进制位 4字节的数据 64位操作系统 8字节 2的64次方的寻址空间 指针压缩技术 JDK1.6出…

聚观早报 | iPhone 15 Pro系列有望成为苹果三年来最大升级

【聚观365】8月3日消息 苹果三年来最大升级 小米驰援北京河北暴雨救灾 印度要求特斯拉仿效苹果 比亚迪7月新能源车销量同比增长61% 富士康计划在印度新建两家零件工厂 苹果三年来最大升级 苹果将继续在今年9月举办一年一度的秋季新品发布会&#xff0c;届时全新的iPhone …

GC 深入(小白,对gc有一个进一步的了解)

垃圾回收器的搭配 一般固定 一般这年轻代垃圾回收器&#xff0c;老年代垃圾回收器&#xff0c;如上图搭配着使用 1.8呢默认就是最后边那哥俩 jvm调优 一个就是增加吞吐量 一个就是减少STW的时间。 三色标记算法&#xff08;理解根可达算法&#xff09; 并发的可达性分析 有…

8.2Jmeter5.1:察看结果树的响应结果乱码

【问题描述】 Jmeter察看结果树的响应结果乱码 原因&#xff1a;jmeter.properties未设置语言 【解决方案】 修改jmeter.properties的属性&#xff0c;然后重启Jmeter # The encoding to be used if none is provided (default ISO-8859-1) sampleresult.default.encodingut…

AB实验遇到用户不均匀怎么办?—— vivo游戏中心业务实践经验分享

作者&#xff1a;vivo 互联网数据分析团队 - Li Bingchao AB实验是业务不断迭代、更新时最高效的验证方法之一&#xff1b;但在进行AB实验效果评估时需要特别关注“用户不均匀”的问题&#xff0c;稍不注意&#xff0c;产出的研究结论就可能谬以千里&#xff0c;给业务决策带来…

百度搭台,千家打擂,文心杯创业大赛成投资人新宠?

“百模大战”打响&#xff0c;掀起大模型领域“创业热潮”。今年5月31日&#xff0c;百度启动“文心杯”创业大赛&#xff08;后简称“大赛”&#xff09;&#xff0c;不到1个月报名时间&#xff0c;吸引近1000个项目激烈角逐&#xff0c;在知名投资人和AI专家的权威评审和层层…

.Net6 Core Web API 配置 log4net + MySQL

目录 一、导入NuGet 包 二、添加配置文件 log4net.config 三、创建MySQL表格 四、Program全局配置 五、帮助类编写 六、效果展示 小编没有使用依赖注入的方式。 一、导入NuGet 包 ---- log4net 基础包 ---- Microsoft.Extensions.Logging.Log4Net…

go逆向符号恢复

前言 之前一直没怎么重视&#xff0c;结果发现每次遇到go的题都是一筹莫展&#xff0c;刷几道题练习一下吧 准备 go语言写的程序一般都被strip去掉符号了&#xff0c;而且ida没有相关的签名文件&#xff0c;没办法完成函数名的识别与字符串的定位&#xff0c;所以第一步通常…

HCIP——BGP反射器及联邦

BGP反射器及联邦 一、路由反射器1、路由反射器的角色2、路由反射规则3、路由反射器下的防环Originator_IDCluster_List应用举例配置方法 二、联邦1、联邦概念2、联邦的配置 路由反射器和联邦是两种专门针对IBGP水平分割设计的解决方案&#xff0c;我们依次来看下这两种技术 一…

基于 Llama2 和 OpenVINO™ 打造聊天机器人

点击蓝字 关注我们,让开发变得更有趣 作者 | 英特尔 AI 软件工程师 杨亦诚 指导 | 英特尔 OpenVINO 布道师 武卓博士 排版 | 李擎 基于 Llama2 和 OpenVINO™ 打造聊天机器人 Llama 2是 Meta 发布了其最新的大型语言模型&#xff0c;Llama2 是基于 Transformer 的人工神经网络&…

SpringCloudAlibaba之Nacos服务的发现与注册中心(一)

一&#xff1a;搭建nacos服务 在windows上搭建&#xff1a; 下载nacos &#xff0c;我在本地下载的是2.1.0 Releases alibaba/nacos (github.com)https://github.com/alibaba/Nacos/releases SpringCloudAlibaba &#xff0c;SpringCoud及Spring Boot之间版本的对应关系在以…

大麦订单生成器 大麦一键生成订单截图

后台一键生成链接&#xff0c;独立后台管理 教程&#xff1a;修改数据库config/Conn 不会可以看源码里有教程 下载程序&#xff1a;https://pan.baidu.com/s/16lN3gvRIZm7pqhvVMYYecQ?pwd6zw3

ACID特性、CAP理论、BASE原则详解

一、ACID 事务&#xff08;transaction&#xff09;&#xff1a;用户定义的一系列执行SQL的操作&#xff0c;这些操作要么完全执行&#xff0c;要么都不执行。 关系型数据库中的事务具有ACID特性 原子性(Atomicity)一致性&#xff08;Consistency&#xff09;隔离性&#xf…

红外NEC通信协议

一、NEC简介 红外(Infrared&#xff0c;IR)遥控是一种无线、非接触控制技术&#xff0c;常用于遥控器、无线键盘、鼠标等设备之间的通信。IR协议的工作原理是&#xff0c;发送方通过红外线发送一个特定的编码&#xff0c;接收方通过识别该编码来执行相应的操作。 IR协议是指红外…

JDK, JRE和JVM之间的区别和联系

JDK, JRE和JVM是与Java编程语言相关的三个重要的概念&#xff0c;它们分别代表Java Development Kit&#xff08;Java开发工具包&#xff09;、Java Runtime Environment&#xff08;Java运行时环境&#xff09;和Java虚拟机&#xff08;Java Virtual Machine&#xff09;。它们…

PHP8的运算符-PHP8知识详解

运算符是可以通过给出的一或多个值&#xff08;用编程行话来说&#xff0c;表达式&#xff09;来产生另一个值&#xff08;因而整个结构成为一个表达式&#xff09;的东西。 PHP8的运算符有很多&#xff0c;按类型分有一元运算符、二元运算符、三元运算符。 一元运算符只对一…

Java类与对象详解(2)

this引用 为什么要有this引用 先来看一个日期类的例子&#xff1a; ​ public class Date {public int year;public int month;public int day;//设置日期方法public void setDay(int y, int m, int d){//这里隐藏了一个Date this参数year y;month m;day d;}public void …

广州银行信用卡中心:强化数字引擎安全,实现业务稳步增长

广州银行信用卡中心是全国城商行中仅有的两家信用卡专营机构之一&#xff0c;拥有从金融产品研发至销售及后期风险控制、客户服务完整业务链条&#xff0c;曾获“2016年度最佳创新信用卡银行”。 数字引擎驱动业务增长 安全左移降低开发风险 近年来&#xff0c;广州银行信用卡…

fetch的使用和实现跨域及与axios的区别

一、作用 和axios作用类似&#xff0c;用于请求接口。它是XMLHttpRequest的一种替代方案。 二、安装 因为fetch有兼容性问题&#xff0c;所以我们安装升级版 whatwg-fetch cnpm i whatwg-fetch -S 三、使用 四、fetch和axios的区别 1&#xff0c;fetch返回的是一个未处理…