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
代码语言:javascript复制#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@0==0 ||(n%4==0 && n0!=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;
}
输出为:
题目描述 给出天数求月份日期-倒计时
输入一个日期,求该日期与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中 如下:
代码语言:javascript复制#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@0==0 ||(n%4==0 && n0!=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;
}
题目描述 求任意日期插值
参考: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
代码语言:javascript复制#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;
}
在线练习:
http://noi.openjudge.cn/
总结
本系列为C 学习系列,会介绍C 基础语法,基础算法与数据结构的相关内容。本文为C 时间模拟相关案例练习。