C++上机_日期差值
5.日期差值
链接: 日期差值_牛客题霸_牛客网
题目:
有两个日期,求两个日期之间的天数,如果两个日期是连续的我们规定他们之间的天数为两天
示例:
输入:有多组数据,每组数据有两行,分别表示两个日期,形式为YYYYMMDD 20110412 20110422 输出:每组数据输出一行,即日期差值 11
代码
1.输入:两个日期
20130212 num1
20142021 num2
输出: 日期差值 n
故可实现一个函数dateToDays:输入年月日,返回该年月日到
0年1月1日的天数。再两个daysToDays()的返回值进行相减。
2.对于dateTodays:
参数:年月日 year ,month,day
返回值:该年月日到一月一日的天数 int
处理: 计算出该年到公元0年1月1日有几天。
==》
使用一个变量resultDays进行统计
先计算该年离公元0年1月1日有几天,封装daysOfyear()
再计算该月里当年的1月1日有几天 ,封装daysOfMonth()
再resultDays+=day-1;
这里的逻辑是不计算当天;
例如2014年5月3日。我们已经通过daysOfyear()计算了公元0年到公元2013年12月31日的天数。
也已经通过了daysOfMonth()计算了前面4个月的天数,即: 1月有31天,2月有28天,3月有31天,4月有30天,只需要再计算5月1日,5月2日。所以还有2天。
当然,你也可以算上当天,那就是resultDays+=day;对这道题来说是不影响的。
3..对于daysOfYear:
参数:年year
返回值:该年离公元0年1月1日有几天 int
处理:利用一个int totalDays统计,即遍历加上前面几个月的天数。注意:闰年有365天,非闰年有365天。
#include <iostream>
using namespace std;
/*
返回值:bool
参数:int year
处理:判断是否为闰年,返回对应的bool
*/
bool isLeap(int year) {
if (year % 400 == 0 || year % 4 == 0 && year % 100 != 0) {
return true;
}
return false;
}
void NextDay(int& year, int& month, int& day) {
//用一个数组存储月份和天数的对应关系
int dayOfMonth[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
//判断是否为闰年(会影响二月的天数)
if (isLeap(year)) {
dayOfMonth[2] = 29;
} else {
dayOfMonth[2] = 28;
}
day++;
if (day > dayOfMonth[month]) {
day = 1;
month++;
}
if (month > 12) {
month = 1;
year++;
}
}
int daysOfyear(int year) {
int totalDays = 0;
for(int i=0;i<year;i++){
if (isLeap(year)) {
totalDays+= 366;
} else {
totalDays += 365;
}
}
return totalDays;
}
/*
参数:年份year,月份month
返回值:该月份离年头有多少天 int
处理:使用int totaldays变量加上前面每月的天数
*/
int daysOfMOnth(int year, int month) {
int totaldays = 0;
int days[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
if (isLeap(year)) {
days[2] = 29; // 闰年2月是29天
}
//例如7月,只需要加到6月
for (int i = 0; i < month; i++) {
totaldays += days[i];
}
return totaldays;
}
/*
参数:年月日 year ,month,day
返回值:该年月日到一月一日的天数 int
处理:计算出该年到公元年有几天。
*/
int dateTodays(int year, int month, int day) {
int resultDays = 0;
//先计算该年离公元0年1月1日有几天
resultDays += daysOfyear(year);
//再计算剩下的月有多少天(可封装一个函数daysOfMOnth())
resultDays += daysOfMOnth(year, month);
//再加上剩下的天
resultDays += (day - 1);
return resultDays;
}
int main() {
int year1, month1, day1;
int year2, month2, day2;
int nums1,nums2;
int count = 1;
scanf("%d\n", &nums1);
scanf("%d\n", &nums2);
year1=nums1/10000;
year2=nums2/10000;
month1=(nums1/100)%100;
month2=(nums2/100)%100;
day1=nums1%100;
day2=nums2%100;
int days1 = dateTodays(year1, month1, day1);
int days2 = dateTodays(year2, month2, day2);
// 计算日期差
int diff = abs(days1 - days2);
printf("%d\n", diff + 1);
return 0;
}
结果
整理
分析以上代码,我整了了几个知识点:
1.adbs()
在代码中,abs()
是一个标准库函数,作用是返回一个数的绝对值。
例如,abs(-10)
会返回 10
,abs(10)
则返回 10
。
2.如何从一个8位数中分别取出前4位,再2位,后2位呢?
==》
可这样理解:去掉后面就是除法,留下后面就是取余
例子: 20140221
年份:去掉后面4位,得结果,即除以10^4
月份:去掉后面2位,得前面6位,再留下后面2位,即(除以10^2再取余10^2)
日期:留下后面2位,即取余10^2
3.各个月份的天数有什么记忆技巧吗?
==》
可以用顺口溜:
“一三五七八十腊,三十一天永不差;
四六九冬三十整,唯有二月二十八(闰年加一)。
” 腊:12月 冬:11月
或用拳头凸起记忆法
方法:双手握拳,用指关节凸起和凹陷表示月份天数:
凸起(关节高):31天的月份(1月、3月、5月、7月、8月、10月、12月)。
凹陷(指缝低):30天的月份(4月、6月、9月、11月)。
2月单独记:平年28天,闰年29天。
4.判断闰年
被4整除但不能被100整除,或者能被400整除的年份。就是闰年。
闰年会影响2月的天数。