当前位置: 首页 > news >正文

【C++算法】类与对象通用题目解析分享

题目一:求1+2+…+n

我们在写算法题的收总有一些奇奇怪怪的算法题限制条件,这时候我们可以用C++类与对象的特性进行思考,比如下面这道题

题目描述

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

示例

输入:5
返回值:15

思路

常规方法**(循环、递归、公式)都被限制了,这里可以利用C++构造函数的特性**:创建对象时会自动调用构造函数。
我们可以定义一个类,用静态成员变量记录累加和与当前数字。创建包含n个该类对象的数组时,构造函数会被调用n次,每次调用时完成一次累加,最终得到1到n的和。

代码实现

class Add
{
public:// 构造函数:每次创建对象时,累加当前数字Add(){_num++;       // 当前数字自增(从1到n)_ret += _num; // 累加和加上当前数字}static int _ret; // 存储累加结果(静态成员,所有对象共享)static int _num; // 存储当前数字(静态成员,记录1到n的迭代)
};// 初始化静态成员变量
int Add::_ret = 0;
int Add::_num = 0;class Solution
{
public:int Sum_Solution(int n){// 每次计算前重置静态变量Add::_num = 0;Add::_ret = 0;// 创建n个Add对象,触发n次构造函数调用,完成累加Add* p = new Add[n];return Add::_ret;}
};

题目二:计算一年的第几天

题目描述

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

示例

输入:2021 7 18
输出:199

思路

  1. 先定义一个数组,存储平年每个月的累计天数(比如1月累计31天,1-2月累计31+28=59天,以此类推)。
  2. 计算前(month-1)个月的总天数,再加上当月的天数,得到初步结果。
  3. 若该年是闰年且月份在3月及以后,需再加1天(因为闰年2月有29天)。

代码实现

#include <iostream>
using namespace std;int main()
{int year, month, day;cin >> year >> month >> day; // 输入日期// 平年1-12月的累计天数(索引0不用,1代表1月,2代表1-2月...)int daysArray[13] = {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365};int totalDay = daysArray[month - 1] + day; // 前month-1个月的天数 + 当月天数// 判断是否为闰年且月份在3月及以后(需要补1天)if ((month > 2) && ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))){totalDay += 1;}cout << totalDay << endl;return 0;
}

题目三:日期差值

题目描述

有两个日期,求两个日期之间的天数。如果两个日期是连续的,规定它们之间的天数为两天(即计算闭区间[date1, date2]的天数)。

示例

输入:19700101 20210718
输出:18827

思路

  1. 先确保date1 <= date2(若不是则交换)。
  2. 拆分两个日期的年、月、日。
  3. 计算两年之间所有完整年份的总天数(平年365天,闰年366天)。
  4. 减去date1当年已过的天数,加上date2当年已过的天数,最后加1(因为是闭区间)。

代码实现

#include <iostream>
using namespace std;// 判断是否为闰年
bool IsLeapYear(int year)
{return ((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0);
}int main()
{int date1, date2;int year1, year2, month1, month2, day1, day2;int ret = 0; // 存储日期差值// 平年每个月的天数(索引0不用)int dayArray[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};while (cin >> date1 >> date2){// 确保date1 <= date2if (date1 > date2){swap(date1, date2);}// 拆分年、月、日(例如19700101拆分为year=1970, month=1, day=1)year1 = date1 / 10000;year2 = date2 / 10000;month1 = (date1 % 10000) / 100;month2 = (date2 % 10000) / 100;day1 = date1 % 100;day2 = date2 % 100;// 计算year1到year2-1之间所有年份的总天数for (int year = year1; year < year2; year++){ret += IsLeapYear(year) ? 366 : 365;}// 计算某日期在当年已过的天数auto getCurYearDays = [&](int year, int month, int day) -> int {int total = 0;for (int i = 1; i < month; i++){total += dayArray[i];// 闰年2月加1天if (i == 2 && IsLeapYear(year))total++;}return total + day;};// 调整差值:减去date1当年已过的天数,加上date2当年已过的天数int days1 = getCurYearDays(year1, month1, day1);int days2 = getCurYearDays(year2, month2, day2);ret = ret - days1 + days2;// 闭区间[date1, date2]需加1ret++;cout << ret << endl;}return 0;
}

题目四:打印日期

题目描述

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

示例

输入:2021 100
输出:2021-04-10

思路

  1. 定义平年每个月的天数数组,若年份是闰年,将2月天数改为29。
  2. 从1月开始,用n依次减去每个月的天数:若n大于当月天数,就减去当月天数并进入下一个月;若n小于等于当月天数,当前月份和剩余的n就是结果。
  3. 按“yyyy-mm-dd”格式输出(月份和日期不足两位补0)。

代码实现

#include <iostream>
using namespace std;int main()
{int year, day;// 平年每个月的天数(索引0不用)int dayArray[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};while (cin >> year >> day){int month = 1; // 从1月开始计算// 若为闰年,2月改为29天if (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0)){dayArray[2] = 29;}else{dayArray[2] = 28; // 平年恢复28天}// 确定月份:用day减去每个月的天数,直到day <= 当月天数while (day > dayArray[month]){day -= dayArray[month];month++;}// 按格式输出(%02d确保月份和日期为两位,不足补0)printf("%d-%02d-%02d\n", year, month, day);}return 0;
}

题目五:日期加天数

题目描述

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

输入描述

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

输出描述

输出m行,每行按“yyyy-mm-dd”格式输出结果。

示例

输入:
2
2021 7 18 100
2021 1 1 100

输出:
2021-10-26
2021-04-11

思路

  1. 先将累加的天数加到“日”上,再逐步调整使日期合法。
  2. 若调整后的“日”大于当月天数:用“日”减去当月天数,月份加1;若月份超过12,则年份加1,月份重置为1。
  3. 每次月份或年份变化时,需重新判断是否为闰年,更新2月的天数。

代码实现

#include <iostream>
using namespace std;// 判断是否为闰年
bool IsLeapYear(int year)
{return ((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0);
}int main()
{int m, year, month, day, n;// 平年每个月的天数(索引0不用)int dayArray[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};cin >> m; // 样例个数for (int i = 0; i < m; i++){cin >> year >> month >> day >> n; // 输入年、月、日和累加天数// 初始化2月天数(根据当前年份是否为闰年)if (IsLeapYear(year)){dayArray[2] = 29;}else{dayArray[2] = 28;}day += n; // 先将天数加到“日”上// 调整日期至合法while (day > dayArray[month]){day -= dayArray[month]; // 减去当月天数month++;                // 月份加1// 月份超过12,年份进位if (month == 13){year++;month = 1;// 更新新年份2月的天数dayArray[2] = IsLeapYear(year) ? 29 : 28;}}// 按格式输出printf("%d-%02d-%02d\n", year, month, day);}return 0;
}
http://www.dtcms.com/a/435332.html

相关文章:

  • C语言中原子操作(简要)
  • 珠宝行业做网站的好处网站建设平台有哪些 谢谢平台建站
  • OpenOCD 终端使用指令大全
  • JS工具函数与代码优化实战
  • 学生信息管理系统|基于Springboot的学生信息管理系统设计与实现(源码+数据库+文档)
  • 哪些ppt网站是免费的wordpress微信验证码
  • 【P0】Spring 面试篇
  • pyqt 播放视频遮罩显示 时钟
  • Day01_刷题niuke20251002
  • 做宠物商品的网站公司网页首页图片
  • 衡水建设网站长沙房地产网站建设
  • linux进程与服务
  • wordpress订阅会员seo建站技术
  • 医疗AI平台化转型:从单点试点到体系化建设的互操作性与质量控制路径研究(下)
  • JavaScript 数组清空的三种方式
  • 网站云空间和普通空间上海传媒公司官网
  • 网站标题正确书写标准微信公众号登录不上
  • 复制标签页导致的Vue动态路由失效问题解决思路
  • 从零起步学习Redis || 第六章:Redis单线程模式的实现详解
  • 影视公司网站设计河南省建设厅厅长
  • PySide6 新(建)窗口 简单示例
  • 逍遥WEBP图片转换组件XiaoyaoWebp.dll
  • 网站建设公司+长春建设部质监局网站
  • Oracle的connect by level在MySQL中的华丽变身
  • wordpress 便签四川旅游seo整站优化站优化
  • K8s基础原理
  • 学习Java第二十八天——黑马点评26~32
  • QML学习笔记(二十三)QML的MouseArea的drag
  • 数据驱动下的GBDT实战指南:从原理拆解到业务落地的方法论
  • 欧拉-马歇罗尼常数