C++031-C++日期模拟

简介: C++031-C++日期模拟

C++031-C++日期模拟


在线练习:

http://noi.openjudge.cn/

https://www.luogu.com.cn/


日期模拟


题目描述 给出天数求月份日期

给定一个年份y和一个整数d,问这一年的第d天是几月几日?

注意闰年的2月有29天。满足下面条件之一的是闰年:


1、年份是4的整数倍,而且不是100的整数倍;

2、年份是400的整数倍。


输入:

年份 和 天数

输出:

返回2行,一行是月份 第二行是天数

样例输入:

2000 360

样例输出:

12 25


#include <iostream>
//#include<bits/stdc++.h>
using namespace std;
int day[13]={0,31,0,31,30,31,30,31,31,30,31,30,31};
bool check(int n)
{
    if(n%400==0 ||(n%4==0 && n%100!=0)){
        return true;
    }
    return false;
}
int main()
{
    int m,n;
    cin>>m>>n;
    if(check(m)) day[2]=29;
    else day[2]=28;
    for(int i=1;i<=12;i++){
        n-=day[i]; //天数-月份的天数
        if(n<=0){ //剩余天数小于0 表示月份为当前月
            cout<<i<<endl; //输出月份
            cout<<day[i]+n; // 输出剩余的天数
            break;
        }
//        if(n==0){ //恰好是整数月份
//            cout<<i<<endl; //输出当前月份
//            cout<<day[i];
//            break;
//        }
    }
    return 0;
}

输出为:

7fef274176cac8c676f33c53988188c4_b5b07e87665046129f75c54431a18f11.png


题目描述 给出天数求月份日期-倒计时

输入一个日期,求该日期与2015年5月17日相差有多少天。注意要求输入的日期小于2015年5月17日。

注意闰年的2月有29天。满足下面条件之一的是闰年:


1、年份是4的整数倍,而且不是100的整数倍;

2、年份是400的整数倍。


输入:

年份 和 天数

输出:

返回2行,一行是月份 第二行是天数

样例输入:

2000 360

样例输出:

12 25


思路1

假设输入的时间为m年n月d日

则先计算m年1月1日到m年n月d日的天数 记为 s1

计算m年1月1日到2014年12月31日的天数 记为s2

计算2015年1月1日到2015年4月17日的天数 记为s3

总天数为 s2+s3 -(s1+1)


思路2

假设输入的时间为m年n月d日

则先计算m年到2015年的完整年份天数,如输入的是2012年3月17日,则计算2013+2014年的完整天数,365+365=730天。

如果输入的年份为2015年,累计完整月数天数到s。然后分为两种情况,一种是为2015年5月,一种是非5月。如果为5月,天数为17-d,如果为非5月,天数为非5月的天数-d+17,如2015年4月17日,则为4月的天数30-d的数字17+17(5月17日)=30天。把天数累计到s。

如果输入的年份不为2015年,累计2015年1月1日到5月17日的日期到s。计算m年n月-m年12月的完整月数天数到s。然后计算当月的天数为day[n]-d,把天数累计到s。如输入的是2012年3月17日,则2012年3月-2012年12月的完整月数天数为

for(int i=n+1;i<=12;i++) s+=day[i];

当月的天数为day[n]-d为31-17=14天,把14天也累加到s中

如下:


#include <iostream>
//#include<bits/stdc++.h>
using namespace std;
int day[13]={0,31,0,31,30,31,30,31,31,30,31,30,31};
bool check(int n)
{
    if(n%400==0 ||(n%4==0 && n%100!=0)){
        return true;
    }
    return false;
}
int s;//计算总天数
int main()
{
    int m,n,d;//对应 年月日
    cin>>m>>n>>d;
    if(check(m)) day[2]=29;
    else day[2]=28;
    for(int i=m+1;i<2015;i++){ //如果年份小于2014年,如输入2013,则计算2014年完整年份天数
        if (check(i)) s+=366;
        else s+=365;
    }
    if(m==2015){ //如果输入的年份为2015
        for(int i=n+1;i<5;i++){//计算完整的月份天数 如输入2月。则计算累加3,4月的完整天数
            s+=day[i];//完整的月份
        }
        if(n==5){//如果月份恰好为5月,相差时间为17-d
            s+=17-d;
        }
        else{//如果不是5月,如输入2月,s累加2月当月的天数-d + 17天
            s+=day[n]-d+17;
        }
    }
    else{ //如果输入的不是2015年
            s += (day[1]+day[2]+day[3]+day[4]+17); //计算2015年1月1日到5月17日的天数
            for(int i=n+1;i<=12;i++){
             s+=day[i];//计算当年到年底的天数如2月17日,则计算3-12月的天数
            }
            s+=day[n]-d;//s加上当月的剩余天数
    }
    cout<<s<<endl;
    return 0;
}

a391ef4c8da9c32dd1f5416ee0480e4d_780db327e6a4425aa657578cd2ff74dd.png


题目描述 求任意日期插值

参考:https://blog.csdn.net/hou1620089770/article/details/107219855/

有两个日期,计算它们之间的差值,如果两个日期是连续的,则按照2天算。

日期格式规定为YYYYMMDD,例如20200709

基本思路

(1)输入两个日期

(2)以小的日期为底,每次加一天,直到与大的日期相等即可

(2.1)增加一天后,月份,年份都可能会随之变化。针对闰年平年以及大小月天数都一样,采用一个12*2的二维数组列出12月的润平年的天数。

(2.2)当达到月份的天数时,月份加1

(2.3)当达到12个月时,年份加1


#include <iostream>
#include <stdio.h>
#include <algorithm>
using namespace std;
bool isLeap(int year) {
  return (year % 4 == 0) && (year % 100 != 0) || (year % 400 == 0);
}
int main() {
  //定义好平年和闰年每月的天数
  int monthDays[13][2] = {
    {0,0},{31,31},{28,29},{30,30},{31,31},{30,30},
    {31,31},{30,30},{31,31},{30,30},{31,31},{30,30},
    {31,31}
  };
  int time1, year1, month1, days1;
  int time2, year2, month2, days2;
  int numbers =1;
  // 输入两个日期
  cout << "输入两个日期,空格分隔";
  cin >> time1 >> time2;
  if (time1>time2){
    int temp = time1;
    time1 = time2;
    time2 = temp;
  }
  //拆解日期,分为年,月,号
  year1 = time1 / 10000; month1 = time1 / 100 % 100; days1 = time1 % 100;
  year2 = time2 / 10000; month2 = time2 / 100 % 100; days2 = time2 % 100;
  //第一个日期 累加到 第二个日期
  while (year1 < year2 || month1 < month2 || days1 < days2) {
    days1++;// 在第一个日期基础上  加一天
    //加一天后,相应的月,年可能也要做一定的变化
    if (days1 == monthDays[month1][isLeap(year1)]+1) {//当前号超过当前月最高天数:月份加1,号变成下月的1号
      month1++;
      days1 = 1;
    }
    if (month1 == 13) {//月份超过12个月 :年份加1,月份变成下年的1月
      year1++;
      month1 = 1;
    }
    numbers++;
  }
  cout << numbers << endl;
  return 0;
}

e0719aec6dd65679a90c007a075cf2ab_4ab5f19551d144978694a5e1a8424361.png


在线练习:


http://noi.openjudge.cn/


总结


本系列为C++学习系列,会介绍C++基础语法,基础算法与数据结构的相关内容。本文为C++时间模拟相关案例练习。


相关文章
|
1月前
|
存储 C++
【C++篇】C++类和对象实践篇——从零带你实现日期类的超详细指南
【C++篇】C++类和对象实践篇——从零带你实现日期类的超详细指南
24 2
【C++篇】C++类和对象实践篇——从零带你实现日期类的超详细指南
|
1月前
|
C++
【C++】实现日期类相关接口(三)
【C++】实现日期类相关接口
|
1月前
|
C++
C++番外篇——日期类的实现
C++番外篇——日期类的实现
79 1
|
1月前
|
C++
【C++】实现日期类相关接口(二)
【C++】实现日期类相关接口
|
1月前
|
C++
【C++】实现日期类相关接口(一)
【C++】实现日期类相关接口
|
5月前
|
C++
【C++】日期类Date(详解)②
- `-=`通过复用`+=`实现,`Date operator-(int day)`则通过创建副本并调用`-=`。 - 前置`++`和后置`++`同样使用重载,类似地,前置`--`和后置`--`也复用了`+=`和`-=1`。 - 比较运算符重载如`&gt;`, `==`, `&lt;`, `&lt;=`, `!=`,通常只需实现两个,其他可通过复合逻辑得出。 - `Date`减`Date`返回天数,通过迭代较小日期直到与较大日期相等,记录步数和符号。 ``` 这是236个字符的摘要,符合240字符以内的要求,涵盖了日期类中运算符重载的主要实现。
|
4月前
|
编译器 C++
【C++】如何用C++写一个日期计算器
【C++】如何用C++写一个日期计算器
|
6月前
|
编译器 C语言 C++
从C语言到C++⑥(第二章_类和对象_中篇_续)大练习(日期类)+笔试选择题(下)
从C语言到C++⑥(第二章_类和对象_中篇_续)大练习(日期类)+笔试选择题
52 2
从C语言到C++⑥(第二章_类和对象_中篇_续)大练习(日期类)+笔试选择题(下)
|
5月前
|
C语言 C++
【C++】日期类Date(详解)③
该文介绍了C++中直接相减法计算两个日期之间差值的方法,包括确定max和min、按年计算天数、日期矫正及计算差值。同时,文章讲解了const成员函数,用于不修改类成员的函数,并给出了`GetMonthDay`和`CheckDate`的const版本。此外,讨论了流插入和流提取的重载,需在类外部定义以符合内置类型输入输出习惯,并介绍了友元机制,允许非成员函数访问类的私有成员。全文旨在深化对运算符重载、const成员和流操作的理解。
|
5月前
|
定位技术 C语言 C++
C++】日期类Date(详解)①
这篇教程讲解了如何使用C++实现一个日期类`Date`,涵盖操作符重载、拷贝构造、赋值运算符及友元函数。类包含年、月、日私有成员,提供合法性检查、获取某月天数、日期加减运算、比较运算符等功能。示例代码包括`GetMonthDay`、`CheckDate`、构造函数、拷贝构造函数、赋值运算符和相关运算符重载的实现。