在很多算法题中,会有很多关于日期的问题
如: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 << "天";
}