跳到主要内容
极客日志极客日志
首页博客AI提示词GitHub精选代理工具
|注册
博客列表

目录

  1. 算法:常见日期问题解析
  2. 一、闰年判断
  3. 问题描述
  4. 解决方法
  5. 代码实现
  6. 二、回文日期
  7. 问题描述
  8. 解决方法
  9. 代码实现
  10. 三、日期差值
  11. 问题描述
  12. 解决方法
  13. 代码实现
  14. 四、日期格式化输入输出
  15. 问题描述
  16. 解决方法
  17. 代码实现
C++算法

C/C++ 算法:常见日期问题解析

本文详细讲解了 C/C++ 算法中常见的四种日期问题:闰年判断、回文日期、日期差值以及日期格式化输入输出。通过模拟法遍历日期并校验属性,结合闰年逻辑与月份天数数组,实现了高效的日期处理方案。重点修正了闰年判断的逻辑错误,并提供了完整的代码示例,适合算法初学者参考学习。

赛博行者发布于 2026/3/290 浏览
C/C++ 算法:常见日期问题解析

算法:常见日期问题解析

日期问题是算法入门中的常见模拟题。本文介绍四种典型的日期处理场景:闰年判断、回文日期、日期差值及格式化输入输出。

一、闰年判断

问题描述

一般题目会给你一个年份,或者让你输入一个年份,让你去判断这个年份是不是闰年。

解决方法

闰年判断规则如下:

  1. 年份能够被 4 整除但不能被 100 整除。
  2. 年份能够被 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);
            }
        }
    }
     ;
}
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog

更多推荐文章

查看全部
  • 蓝桥杯省赛 Java A 组 Q6:砍柴题解
  • GitHub Actions 下载工件指南:download-artifact 插件使用详解
  • C++ AVL 树详解与实现
  • 主流C语言开发工具对比:VS/CLion/VSCode/Dev C++选型指南

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown 转 HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML 转 Markdown 互为补充。 在线工具,Markdown 转 HTML在线工具,online

  • HTML 转 Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML 转 Markdown在线工具,online

  • JSON 压缩

    通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online

30
31
30
31
31
30
31
30
31
int is_leap(int year)
if
4
0
100
0
400
0
return
1
return
0
int get_day(int year,int month)
if
2
return
28
is_leap
return
void next_day(int &y,int &m,int &d)
if
get_day
1
if
12
1
bool check1(char s[])
for
int
0
7
if
return
false
return
true
bool check2(char s[])
char
0
char
1
char
2
char
3
if
return
true
return
false
int main()
int
char
10
scanf
"%04d%02d%02d"
while
next_day
sprintf
"%04d%02d%02d"
if
check1
if
true
puts
if
check2
true
puts
return
0

三、日期差值

问题描述

给定两个日期,求这两个日期之间有多少天。如果两个日期是连续的,规定他们之间的天数为两天。

解决方法

转换思路,分别计算两个日期距离公元元年 1 月 1 日的总天数 t1 和 t2,答案即为 |t2-t1|+1。计算时需考虑闰年多一天及每月天数不同。

代码实现

#include<iostream>
using namespace std;
int months[]={0,31,28,31,30,31,30,31,31,30,31,30,31};

int is_leap(int year){
    if(year%4==0&&year%100!=0||year%400==0){
        return 1;
    }else{
        return 0;
    }
}

int getday(int year,int month){
    if(month==2)return 28+is_leap(year);
    return months[month];
}

int calc(int year,int month,int day){
    int ans=0;
    for(int i=1;i<year;i++){
        ans+=365+is_leap(i);
    }
    for(int i=1;i<month;i++){
        ans+=getday(year,i);
    }
    return ans+day;
}

int main(){
    int y1,m1,d1,y2,m2,d2;
    while(~scanf("%04d%02d%02d\n%04d%02d%02d",&y1,&m1,&d1,&y2,&m2,&d2)){
        printf("%d\n",abs(calc(y1,m1,d1)-calc(y2,m2,d2))+1);
    }
    return 0;
}

四、日期格式化输入输出

问题描述

当需要按照特定格式(如 yyyy 年 mm 月 dd 日)进行输入输出时,若数字不足指定位数,前面需要补 0。

解决方法

利用 C/C++ 标准库的格式化输出功能,使用 %0Nd 格式符,其中 N 为指定位数,0 表示用 0 填充。

代码实现

// 输入,不足的补 0
scanf("%04d%02d%02d",&y1,&m1,&d1);
// 输出方法一
printf("%04d%02d%02d",y,m,d);
// 输出方法二
sprintf(s,"%04d%02d%02d",y,m,d);
puts(s);

日期问题在模拟题中比较常见,掌握闰年判断、日期模拟及格式化输入输出是解决此类问题的基础。