算法:常见日期问题解析
日期问题是算法入门中的常见模拟题。本文介绍四种典型的日期处理场景:闰年判断、回文日期、日期差值及格式化输入输出。
一、闰年判断
问题描述
一般题目会给你一个年份,或者让你输入一个年份,让你去判断这个年份是不是闰年。
解决方法
闰年判断规则如下:
- 年份能够被 4 整除但不能被 100 整除。
- 年份能够被 400 整除。 满足任意一个条件即为闰年。
代码实现
#include<stdio.h>
int main(){
int year;
scanf("%d",&year);
if(year%4==0&&year%100!=0||year%400==0){
printf("%d is a leap year\n",year);
}else{
printf("%d is not a leap year\n",year);
}
return 0;
}
二、回文日期
问题描述
回文日期是指按 "yyyymmdd" 格式写成一个 8 位数是回文数的日期。例如 20200202。本题要求计算给定日期之后的下一个回文日期和下一个 ABABBABA 型的回文日期。
解决方法
通过模拟递增日期,每次检查是否为回文数。需要处理月份天数变化及闰年判断。ABABBABA 型需满足 A≠B。
代码实现
#include<iostream>
using namespace std;
bool found1=false,found2=false;
int months[]={0,31,28,31,,,,,,,,,};
{
(year%==&&year%!=||year%==){
;
}
;
}
{
(month==){
+(year);
}
months[month];
}
{
d++;
(d>(y,m)){
d=;
m++;
(m>){
m=;
y++;
}
}
}
{
( i=,j=;i<j;i++,j--){
(s[i]!=s[j]){
;
}
}
;
}
{
a=s[];
b=s[];
c=s[];
d=s[];
(a==c&&b==d&&a!=b){
;
}
;
}
{
y,m,d;
s[];
(,&y,&m,&d);
(!found1||!found2){
(y,m,d);
(s,,y,m,d);
((s)){
(!found1){
found1=;
(s);
}
(!found2&&(s)){
found2=;
(s);
}
}
}
;
}


