【算法题】日期类算法题


1.计算日期到天数转换

https://www.nowcoder.com/share/jump/4804461771777179853479https://www.nowcoder.com/share/jump/4804461771777179853479

描述

每一年中都有 1212 个月份。其中,1,3,5,7,8,10,121,3,5,7,8,10,12 月每个月有 3131 天;4,6,9,114,6,9,11 月每个月有 3030 天;而对于 22 月,++闰年++ 时有 2929 天,平年时有 2828 天。
现在,对应输入的日期,计算这是这一年的第几天。
一个年份是++闰年++ 当且仅当它满足下列两种情况其中的一种:
∙ ∙这个年份是 44 的整数倍,但不是 100100 的整数倍;
∙ ∙这个年份是 400400 的整数倍。

输入描述:

在一行上输入三个整数 a,b,c(1900≦a≦2200)a,b,c(1900≦a≦2200),分别代表年、月、日。保证输入的日期是合法的。

输出描述:

输出一个整数,代表输入的日期是这一年的第几天

题解:

复制代码
#include <atomic>
#include <climits>
#include <iostream>
using namespace std;
int main() {
    int arr[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
    int a, b,c,sum;
     cin >> a >> b >> c; // 注意 while 处理多个 case
        if(((a%4==0&&a%100!=0)||a%400==0))
        {
            arr[2]=29;
        }
        for(int i=1;i<b;i++)
        {
            sum+=arr[i];
        }
        cout << sum+c << endl;
}

2.日期差值

https://www.nowcoder.com/share/jump/4804461771777187635425https://www.nowcoder.com/share/jump/4804461771777187635425

描述

有两个日期,求两个日期之间的天数,如果两个日期是连续的我们规定他们之间的天数为两天

输入描述:

有多组数据,每组数据有两行,分别表示两个日期,形式为YYYYMMDD

输出描述:

每组数据输出一行,即日期差值

题解:

复制代码
#include <climits>
#include <ctime>
#include <iostream>
using namespace std;
int GetMonthDay(int y,int m)
{
    int month[] = { 0, 31, 28, 31, 30, 31, 30, 31,31, 30, 31, 30, 31 };
    if (m == 2 && ((y % 4 == 0 && y % 100 != 0)|| y % 400 == 0))
        return 29;
    return month[m];
}
class Date
{
    public:
    Date(int year=1,int month=1,int day=1)
    :_year(year)
    ,_month(month)
    ,_day(day)
    {}
    friend Date GetDate(int n);
    bool operator!=(Date& d)
    {
        if(_year!=d._year)
        return true;
        if(_month!=d._month)
        return true;
        if(_day!=d._day)
        return true;
        return false;
    }
    Date& operator++()
    {
        ++_day;
        if(_day>GetMonthDay(_year,_month))
        {
            _day-=GetMonthDay(_year,_month);
            ++_month;
            if(_month==13)
            {
                ++_year;
                _month=1;
            }
        }
        return *this;
    }
    bool operator<(Date& d)
    {
        if(_year<d._year)
        return true;
        if(_month<d._month)
        return true ;
        if(_day<d._day)
        return true;
        return false;
    }
    int operator-(Date& d)
    {
        Date maxi=*this;
        Date mini=d;
        if(*this<d)
        {
            maxi=d;
            mini=*this;
        }
        int count=0;
        while(mini!=maxi)
        {
            ++count;
            ++mini;
        }
        return count;
    }
    private:
    int _year;
    int _month;
    int _day;
};
Date GetDate(int n)
{
    Date d;
    d._year=n/10000;
    d._month=n/100-d._year*100;
    d._day=n%100;
    return d;
}
int main() {
  int a,b;
  while(cin>>a>>b)
  {     
    Date d1=GetDate(a);
    Date d2=GetDate(b);
    if(d1<d2)
    cout<<d2-d1+1<<endl;
    else
    cout<<d1-d2+1<<endl;
  }
}

3. 打印日期

https://www.nowcoder.com/share/jump/4804461771777181984174https://www.nowcoder.com/share/jump/4804461771777181984174

描述

给出年分m和一年中的第n天,算出第n天是几月几号。

输入描述:

输入包括两个整数y(1<=y<=3000),n(1<=n<=366)。

输出描述:

可能有多组测试数据,对于每组数据, 按 yyyy-mm-dd的格式将输入中对应的日期打印出来。

题解

复制代码
#include <iostream>
using namespace std;

int main() {
    int year=0,day=0,month=0;
    while(cin>>year>>day)
    {
     int arr[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
     if((year%4==0&&year%100!=0)||year%400==0)
    {
        arr[2]=29;
    }
    for(int i=1;i<13;i++)
    {
        if(day>arr[i])
        {
            day-=arr[i];
        }
        else{
            month=i;
            break;
        }
    }
    if(month<10)
    {
        if(day<10)
        cout<<year<<"-"<<0<<month<<"-"<<0<<day<<endl;
        else
        cout<<year<<"-"<<0<<month<<"-"<<day<<endl;
    }
    if(month>=10)
    {
        if(day<10)
        cout<<year<<"-"<<month<<"-"<<0<<day<<endl;
        else
        cout<<year<<"-"<<month<<"-"<<day<<endl;
    }
}
    }

解法二:构造函数

复制代码
#include<iostream>
using namespace std;
class Date{
    public:
    Date(int year,int day)
        :_day(0),_month(1),_year(year)
    { 
        int tmp=day;
        isleapyear=(!(_year % 4) && _year % 100) || !(_year % 400);
        for(int mday=getmonthday(_month);tmp>mday;mday=getmonthday(_month)){
            _month++;
            if(_month==13){
                _year++;
                _month=1;
            }
            tmp-=mday;
        }
        _day=tmp;
    printf("%04d-%02d-%02d\n", _year, _month, _day);
    }
    private:
    int getmonthday(int month){
        static int monthdayarr[]={31,28,31,30,31,30,31,31,30,31,30,31};
        return monthdayarr[month-1]+(month==2&&isleapyear?1:0);
    }
    bool isleapyear;
    int _year;
    int _month;
    int _day;
};
int main(){
    int year,day;
    while(~scanf("%d %d",&year,&day)){
        Date tmp(year,day);
    }
}

4.日期累加

https://www.nowcoder.com/share/jump/4804461771777184990072https://www.nowcoder.com/share/jump/4804461771777184990072

描述

设计一个程序能计算一个日期加上若干天后是什么日期。

输入描述:

输入第一行表示样例个数m,接下来m行每行四个整数分别表示年月日和累加的天数。

输出描述:

输出m行,每行按yyyy-mm-dd的个数输出。

题解:

复制代码
#include <iostream>
#include <type_traits>
using namespace std;
bool isleapYear(int year)
{
    if((year%4==0&&year%100!=0)||year%400==0)
    {
        return true;
    }
    return false;
}
int main() {
    int x,year,day,month,num;
    cin>>x;
  while(cin>>year>>month>>day>>num)
  {
      int arr[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
      if(isleapYear(year))
     {
         arr[2]=29;
     }
      day+=num;
      for(int i=month;i<100;i++)
      {
        if(i==13)
        {   
            year++;
            if(isleapYear(year))
            {
                 arr[2]=29;
            }
            else {
            arr[2]=28;
            }
            i=0;
        }
        if(day>arr[i])
        {
            day-=arr[i];
        }
        else 
        {
           month=i;
           break;
        }
      }
       if(month<10)
    {
        if(day<10)
        cout<<year<<"-"<<0<<month<<"-"<<0<<day<<endl;
        else
        cout<<year<<"-"<<0<<month<<"-"<<day<<endl;
    }
    if(month>=10)
    {
        if(day<10)
        cout<<year<<"-"<<month<<"-"<<0<<day<<endl;
        else
        cout<<year<<"-"<<month<<"-"<<day<<endl;
    }
      
  }
}

相关推荐
.ZGR.17 小时前
线程池相关知识及并发统计案例实现
java·开发语言
拉拉拉拉拉拉拉马17 小时前
Windsurf 最新版进阶讲解:从 Cascade 到 Devin Local,重新理解 AI 编程工作流
人工智能·算法
流年如夢17 小时前
初入C++
开发语言·c++
Mr_pyx17 小时前
面试题记录
jvm·数据结构·算法·spring·mybatis
zzzsde17 小时前
【Linux】线程同步和互斥(1):线程互斥与加锁实现
linux·运维·服务器·开发语言·算法
yoyo_zzm17 小时前
编程语言大比拼:C++到PHP全解析
开发语言·c++·php
xian_wwq17 小时前
【学习笔记】探讨大模型应用安全建设系列2——安全评估:攻击面梳理与差距分析
笔记·学习·安全
努力努力再努力wz17 小时前
【C++高阶数据结构系列】:时间轮定时器详解:原理分析与代码实现,带你从零手撕时间轮!(附时间轮的实现源码)
c语言·开发语言·数据结构·c++·qt·算法·ui
ljt272496066117 小时前
Vue笔记(三)--用户交互
javascript·vue.js·笔记
网络工程小王18 小时前
【大模型vLLM 使用】学习笔记
笔记·学习·llama