如何用算法快速算出间隔多久呢?
1)首先一年有12个月,但是在计算机中,计数是从0开始的。
所以我们要先定义一个包含13个数值的数组。
int days[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
days[1]指的是0月,即不存在的月份,所以days[1]=0,依次类推。
2)在日历中,有闰年和平年之分。闰年的2月是有29天的。
闰年的标志是能被4整除,但是闰年还有另外一个不是很为认知的标志:就是闰年不能被100整除!但还有一个很特殊的年份,能被400整除的年份被称为世纪年,也是闰年。闰年的2月,赋值为29,其他的不变。
所以,对年份进行判读并赋值:
int getDay(int y,int m){
if(m!=2){
return days[m];
}else{
if((y%4==0&&y%100!=0)||y%400==0){
return 29;
}else{
return 28;
}
}}
s代表start,e代表end。
y代表year,m代表month,d代表day.
sy就代表开始年份,ed代表结束日期,以此类推。
3)接下来就是计算时间了,首先我们要先判断年份的区别,当结束年月日小于等于开始年月日的时候,我们设定答案为0。
int sy,sm,sd,ey,em,ed,ans;
cin>>sy>>sm>>sd;
cin>>ey>>em>>ed;
ans=0;
当结束年月日是在开始年月日之后的时候,我们的计算公式为:
while(sy!=ey||sm!=em||sd!=ed){
ans++;
sd++;
if(sd>getDay(sy,sm)){
sd=1;
if(sm==12){
sy++;
sm=1;
}else{
sm++;
}
}
}
能不能理解这一段公式呢?
我们来用中文解读一遍,绿色是思路
当(开始年月日不完全相同的时候)
每次计数,ans+1
sd+1。
第一重判断:sd>getDay(sy,sm)
sd=1
如果日期数大于当年当月最大数值,比如2016年2月29日,实际上是不存在这个日期的,就会自动变成2016年3月1日。并且月份加1;
第二重判断:sm==12
每次月份都加1了,但是一年只有12个月,如果等于12了再加月份,就将月份赋值为1,年份+1。
这段公式的作用是什么呢?很简单,就是从开始日期,比如我们题目中的2016年6月24日开始数数,一直数到2018年1月18日结束!然后输出总共花费了多少时间。
最后输出的ans就是总共数了多个day的结果了~唔,是不是不太好理解?不妨自己动手试试吧!
以下是完整源代码:
答案是573,你有没有答对呢?
那么今天关于计算机日期计算的小技巧就介绍到这里咯。我是有小渔的朋友,现在还没有一个响当当的名字,如果你有好听的名字,欢迎留言告诉我哦!
欢迎有渔编程公众号,每日更新少儿编程相关干货!
