提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
一、判断闰年
如果年份是400的倍数,或者是4的倍数但不是100的倍数,那么称这个年份为闰年
#include<cstdio>
int main(){
int n;
scanf("%d",&n);
if(n%400==0){
printf("YES");}
else{
if(n%4==0&&n%100!=0)
printf("YES");
else printf("NO");}
return 0;
}
二、日期加法
给定一个日期
和一个正整数
,求日期
加上
n 天后的日期。
#include <cstdio>
// 每个月的天数
int dayOfMonth[2][13] = {
{0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
{0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
};
// 是否是闰年
bool isLeapYear(int year) {
return year % 400 == 0 || (year % 4 == 0 && year % 100 != 0);
}
// 给当前日期加1天(注意参数都用了引用&,这样对参数的修改可以同步到函数外)
void addOneDay(int &year, int &month, int &day) {
day++; // 让day加1
if (day > dayOfMonth[isLeapYear(year)][month]) { // 如果超过当前月的天数
month++; // 让month加1
day = 1; // 重置day为1号
}
if (month > 12) { // 如果月份大于12
year++; // 让year加1
month = 1; // 重置month为1月
}
}
int main() {
int year, month, day, n;
scanf("%d-%d-%d", &year, &month, &day); // 按格式输入年月日
scanf("%d", &n); // 输入需要增加的天数
for (int i = 0; i < n; i++) { // 遍历n次,每次加1天
addOneDay(year, month, day);
}
printf("%04d-%02d-%02d", year, month, day); // 按格式输出年月日
return 0;
}
三、日期减法
#include <cstdio>
// 每个月的天数
int dayOfMonth[2][13] = {
{0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
{0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
};
// 是否是闰年
bool isLeapYear(int year) {
return year % 400 == 0 || (year % 4 == 0 && year % 100 != 0);
}
// 给当前日期加1天(注意参数都用了引用&,这样对参数的修改可以同步到函数外)
void addOneDay(int &year, int &month, int &day) {
day++; // 让day加1
if (day > dayOfMonth[isLeapYear(year)][month]) { // 如果超过当前月的天数
month++; // 让month加1
day = 1; // 重置day为1号
}
if (month > 12) { // 如果月份大于12
year++; // 让year加1
month = 1; // 重置month为1月
}
}
int main() {
int year, month, day, n;
scanf("%d-%d-%d", &year, &month, &day); // 按格式输入年月日
scanf("%d", &n); // 输入需要增加的天数
for (int i = 0; i < n; i++) { // 遍历n次,每次加1天
addOneDay(year, month, day);
}
printf("%04d-%02d-%02d", year, month, day); // 按格式输出年月日
return 0;
}
以YYYY-MM-DD的格式输出减少了
n天后的日期
#include <cstdio>
// 每个月的天数
int dayOfMonth[2][13] = {
{0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
{0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
};
// 是否是闰年
bool isLeapYear(int year) {
return year % 400 == 0 || (year % 4 == 0 && year % 100 != 0);
}
// 给当前日期加1天(注意参数都用了引用&,这样对参数的修改可以同步到函数外)
void addOneDay(int &year, int &month, int &day) {
day--; // 让day加1
if (day < 1) { // 如果超过当前月的天数
month--; // 让month加1
// 重置day为1号
}
if (month < 1) { // 如果月份大于12
year--; // 让year加1
month = 12; // 重置month为1月
}
if (day < 1) {
day = dayOfMonth[isLeapYear(year)][month];
}
}
int main() {
int year, month, day, n;
scanf("%d-%d-%d", &year, &month, &day); // 按格式输入年月日
scanf("%d", &n); // 输入需要增加的天数
for (int i = 0; i < n; i++) { // 遍历n次,每次加1天
addOneDay(year, month, day);
}
printf("%04d-%02d-%02d", year, month, day); // 按格式输出年月日
return 0;
}
四、一年中的第几天
给定一个日期,计算它是所在年份中的第几天
#include <cstdio>
int dayOfMonth[2][13] = {
{0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
{0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
};
bool isLeapYear(int year) {
return year % 400 == 0 || (year % 4 == 0 && year % 100 != 0);
}//当 isLeapYear(year) 返回 true(即表示是闰年)时,使用的就是 dayOfMonth[1][i],即闰年中第 i 个月的天数;当返回 false(表示是平年)时,使用的就是 dayOfMonth[0][i],即平年中第 i 个月的天数。
int main() {
int year, month, day;
scanf("%d-%d-%d", &year, &month, &day);
int result = day;
for (int i = 1; i < month; i++) {
result += dayOfMonth[isLeapYear(year)][i];
}
printf("%d", result);
return 0;
}
五、日期先后
#include <cstdio>
bool binianfen(int year1, int month1, int day1, int year2, int month2, int day2){
if(year1!=year2){
return year1<year2;
}
if(month1!=month2){
return month1<month2;
}
return day1<day2;
}
int main(){
int year1,month1,day1;
int year2,month2,day2;
scanf("%d-%d-%d",&year1,&month1,&day1);
scanf("%d-%d-%d",&year2,&month2,&day2);
printf(binianfen(year1, month1, day1, year2, month2, day2)?"YES":"NO");
return 0;
}
五,判断周几
#include <cstdio>
int dayOfMonth[2][13] = {
{0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
{0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
};
bool isLeapYear(int year) {
return year % 400 == 0 || (year % 4 == 0 && year % 100 != 0);
}
void addOneDay(int &year, int &month, int &day) {
day++;
if (day > dayOfMonth[isLeapYear(year)][month]) {
month++;
day = 1;
}
if (month > 12) {
year++;
month = 1;
}
}
void subOneDay(int &year, int &month, int &day) {
day--;
if (day < 1) {
month--;
}
if (month < 1) {
year--;
month = 12;
}
if (day < 1) {
day = dayOfMonth[isLeapYear(year)][month];
}
}
bool isBefore(int year1, int month1, int day1, int year2, int month2, int day2) {
if (year1 != year2) {
return year1 < year2;
}
if (month1 != month2) {
return month1 < month2;
}
return day1 < day2;
}
bool isAfter(int year1, int month1, int day1, int year2, int month2, int day2) {
if (year1 != year2) {
return year1 > year2;
}
if (month1 != month2) {
return month1 > month2;
}
return day1 > day2;
}
int main() {
int year1 = 2021, month1 = 5, day1 = 1, dayOfWeek = 6;
int year2, month2, day2;
scanf("%d-%d-%d", &year2, &month2, &day2);
if (isBefore(year1, month1, day1, year2, month2, day2)) {
while (isBefore(year1, month1, day1, year2, month2, day2)) {
addOneDay(year1, month1, day1);
dayOfWeek = (dayOfWeek + 1) % 7;
}
} else if (isAfter(year1, month1, day1, year2, month2, day2)) {
while (isAfter(year1, month1, day1, year2, month2, day2)) {
subOneDay(year1, month1, day1);
dayOfWeek = (dayOfWeek - 1 + 7) % 7;
}
}
printf("%d", dayOfWeek);
return 0;
}