算法题中的日期问题

在很多算法题中,会有很多关于日期的问题

如:1已知某年某月某日,问过了若干天是几年几月几日

2已知某年某月某日是星期几,过了若干天是星期几

这种问题都可以总结为已知某年某月某日,求明天是几月几号

cpp 复制代码
#include<iostream>
using namespace std;
void NextDay(int year, int month, int day) {
	int DayOfMonth[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
	bool isLeap = false;
	if (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)) {
		isLeap = true;
	}
	if (isLeap) {
		DayOfMonth[2] = 29;
	}
	++day;
	if (day > DayOfMonth[month]) {
		day = 1;
		++month;
	}
	if (month > 12) {
		month = 1;
		year++;
	}
	cout << year << "年" << month << "月" << day << "日" << endl;
}
int main() {
	while (true) {
		int year, month, day;
		cin >> year >> month >> day;
		NextDay(year, month, day);
	}

}

上述代码需要注意此时main函数的年月日与NextDay函数的年月日并不是同一份数据

cpp 复制代码
#include<iostream>
using namespace std;
void NextDay(int *year, int *month, int *day) {
	int DayOfMonth[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
	bool isLeap = false;
	if (* year % 400 == 0 || (* year % 4 == 0 && * year % 100 != 0)) {
		isLeap = true;
	}
	if (isLeap) {
		DayOfMonth[2] = 29;
	}
	++*day;
	if (*day > DayOfMonth[*month]) {
		*day = 1;
		++*month;
	}
	if (*month > 12) {
		*month = 1;
		++*year;
	}
	cout << *year << "年" << *month << "月" << *day << "日" << endl;
}
int main() {
	while (true) {
		int year, month, day;
		cin >> year >> month >> day;
		NextDay(&year, &month, &day);
	}
}

上述代码需要注意此时main函数的年月日与NextDay函数的年月日是同一份数据

3输入年、月、日,计算该天是本年的第几天。

我们如何利用上面的模板来解决呢

定义初始年月日为对应年份一月一号

我们可以定义一个count=1表示是本年的第几天

调整循环条件即可

cpp 复制代码
#include<iostream>
using namespace std;
void NextDay(int* year, int* month, int* day) {
	int DayOfMonth[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
	bool isLeap = false;
	if (*year % 400 == 0 || (*year % 4 == 0 && *year % 100 != 0)) {
		isLeap = true;
	}
	if (isLeap) {
		DayOfMonth[2] = 29;
	}
	++* day;
	if (*day > DayOfMonth[*month]) {
		*day = 1;
		++* month;
	}
	if (*month > 12) {
		*month = 1;
		++* year;
	}
}
int main() {
	int year, month, day;
	cin >> year >> month >> day;
	int y = year, m = 1, d = 1;
	int count = 1;
	while (y != year || m != month || d != day) {
		NextDay(&y, &m, &d);
		count++;
	}
	cout << "输入日期是本年的第" << count << "天";
}
相关推荐
刚入门的大一新生几秒前
Linux-线程互斥
java·开发语言
香芋芋圆20 分钟前
iD-editor 详解|OSM官方在线编辑器,基于D3.js的轻量地图编辑器
开发语言·javascript·编辑器
罗西的思考33 分钟前
【轻量化复刻大模型】线性注意力交互式演示
人工智能·算法·机器学习
神也畏惧菠萝43 分钟前
Day08 Python流程控制从入门到上瘾:if/match/while/for四件套,从B站登录一路打到猜数字游戏
python·算法·数据存储·for·while·if·ifelse
揽星河..1 小时前
【C语言】分支和循环
c语言·c++·算法
小熊恋旧1 小时前
Python 面向对象编程:方法、属性、继承与多态详解
开发语言·python
云边云科技_云网融合1 小时前
面向汽车零部件制造业场景的解决方案 | 70 秒:一台车下线的时间里,藏着五张网
开发语言·汽车·php
Evand J1 小时前
【PMSM滤波例程2】PMSM未知负载转矩观测EKF。MATLAB例程(负载增广EKF与实际仿真结果)。附下载链接
开发语言·matlab·电机
will_net1 小时前
apollo 站点部署&C#接入
开发语言·c#·apollo