模拟题介绍
入门模拟题 分为简单模拟,查找元素,图形输出,日期处理,进制转换,字符串处理等等!
何为模拟题?
模拟题是一类“题目怎么说,你就怎么做的”的一类题目。此类题目不涉及算法,完全根据题目描述进行代码的编写,主要考察代码能力!!!
今天讲述一道模拟题 —— 日期处理
大家应该知道日期,时间等等的转换处理有些许麻烦的。
时间些许好一些,但比如日期需要考虑闰平年,每个月是否是大小月等等…
题目描述
有两个日期,求两个日期之间的天数,如果两个日期是连续的我们规定他们之间
的天数为两天。
输入
有多组数据,每组数据有两行,分别表示两个日期,形式为YYYYMMDD
输出
每组数据输出一行,即日期差值
样例输入 Copy
20130101
20130105
样例输出 Copy
5
题意:
多组测试用例,每组测试用例输入两个日期,日期输入样式如上。结果输出两个日期之间的差值!!!
看到此时脑子是否在高速运转呢?
1,你是否是采用结构体然后定义两个结构体变量输入数据并采用
scanf ("%4d%2d%2d", ..........)
2,你是否采用的思路是结构体变量a 和 结构体变量b 两者相减得出天数。
(相减当然没错,复杂度可想而知,需要考虑很多!)
3,闰平年是否直接判断,大小月又是否直接判断?
好吧!以上的思路都是错的,都是非常繁琐的(最后不一定Accept)
提供一个简单易行思路:
将最小日期天数不断的加1,直到加到并且等于大日期,中间走过的天数即是差值。
C++代码
include <cstdio>
bool isLeap(int year)//润平年判断,真返回1, 否返回0
{
return ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0));
}
int month[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}};
//定义二维数组,第一维放平年,第二维放闰年
//行数定义13目的使一月直接对应month[1][x],更加直观
int main()
{
int time1, y1, m1, d1;
int time2, y2, m2, d2;
//由于日期始终为6位数,可以用整型变量来表示
while (scanf("%d%d", &time1, &time2) != EOF) {
if (time1 > time2) {//始终保持小日期在前,大日期在后
int temp = time1;
time1 = time2;
time2 = temp;
}
y1 = time1/ 10000; m1 = time1 % 10000 / 100, d1 = time1 % 100;
y2 = time2/ 10000; m2 = time2 % 10000 / 100, d2 = time2 % 100;
//将日期的大数换为日期
int ans = 1;//天数统计变量
while (y1 < y2 || m1 < m2 || d1 < d2) {
//在y1 == y2 ,m1 == m2, d1 == d2 时结束循环,否则继续循环
d1++;
if ( d1 == ( month[m1][isLeap(y1)] + 1) )//这里体现啦二维数组的优越啦
{
m1++;
d1 = 1;
}
if (m1 == 13)
{
y1++;
m1 = 1;
}
//以上if条件里是天数变换和月数以及年数的不断变换
ans++;
}
printf("%d\n", ans);//最终打印差值天数
}
return 0;
}