【算法题】日期类算法题


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;
    }
      
  }
}

相关推荐
初心未改HD2 小时前
Go语言Map底层原理与并发安全深度解析
开发语言·golang
不会编程的懒洋洋2 小时前
C# IDisposable 和 using
开发语言·笔记·机器学习·c#·.net·visual studio·c#基础
穿条秋裤到处跑2 小时前
每日一道leetcode(2026.04.27):检查网格中是否存在有效路径
算法·leetcode·职场和发展
Fighting_p2 小时前
【FileShowCom 组件】文件预览:图片预览 el-image,其余文件预览打开新窗口或者下载
开发语言·前端·javascript
XiYang-DING2 小时前
【Java EE】线程池
java·开发语言·java-ee
想唱rap2 小时前
TCP套接字编程
java·linux·网络·c++·tcp/ip·mysql·ubuntu
xyq20242 小时前
PostgreSQL LIMIT 指令详解
开发语言
小短腿的代码世界2 小时前
Qt 2D 绘制系统核心原理深度解析
开发语言·qt