您的位置:首页 > 其它

【上机笔试之五】计算两个日期的差值

2017-03-09 16:50 1126 查看
计算两个日期差的天数是上机笔试中常考的一种提醒,这里程序的大致思路是:预先计算出每一天距离1900年1月1日的天数,两次结果一做差就是两个日期差的天数。代码如下:

#include <iostream>
#include <algorithm>
#include <string.h>
using namespace std;
//判断是否是闰年
#define ISYEAP(x) ((x % 100 != 0) && (x % 4 != 0) || (x % 400 != 0)) ? 1 : 0
//预设闰年和非闰年每月的天数
int daynum[13][2] = {
{ 0 , 0  },
{ 31, 31 },
{ 28, 29 },
{ 31, 31 },
{ 30, 30 },
{ 31, 31 },
{ 30, 30 },
{ 31, 31 },
{ 31, 31 },
{ 30, 30 },
{ 31, 31 },
{ 30, 30 },
{ 31, 31 },
};
struct Date{
int year;
int month;
int day;
void nextday(){
day++;
if (day > daynum[month][ISYEAP(year)]) {
day = 1;
month++;
if (month > 12) {
month = 1;
year++;
}
}
}
};
int abs(int y){
return (y > 0) ? y : -y;
}
//程序思路:预先计算出每一天距离1900年1月1日的天数,两次结果一做差就是两个日期差的天数。
//缺点,如果设定的基准日期比1900年小很多,会导致数组太大,空间溢出。
void main()
{
int y1,y2,m1,m2,d1,d2;
int buf[201][13][32];
Date tmp;
tmp.day = 1;
tmp.month = 1;
tmp.year = 1900;
int num = 0;
while (tmp.year < 2100){
num++;
buf[tmp.year - 1900][tmp.month][tmp.day] = num;
tmp.nextday();
}
while ( scanf("%4d%2d%2d", &y1, &m1, &d1) != EOF) {
scanf("%4d%2d%2d", &y2, &m2, &d2);
printf("%d", abs(buf[y2 - 1900][m2][d2] - buf[y1 - 1900][m1][d1]) + 1);
}
}


上机笔试系类教程:

【上级笔试之一】数据输入

【上机笔试之二】冒泡排序

【上机笔试之三】快速排序

【上机笔试之四】快速排序(2)

【上机笔试之五】计算两个日期的差值

【上机笔试之六】Hash应用

【上机笔试之七】Hash应用(2)-从大到小顺序输出其中前m大的数

【上机笔试之八】二分法查找

【上机笔试之九】贪心算法-换零钱

【上机笔试之十】栈应用-扣号匹配
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  上机笔试