点击查看代码
/*
有两个日期,求两个日期之间的天数,如果两个日期连续,则规定它们之间的天数为两天
输入格式:
有多组数据,每组数据有两行,分别表示两个日期,形式为YYYYMMDD
输出格式:
每组数据输出一行,即日期差值
输入样例:
20130101
20130105
输出样例:
5
解题思路:
1、以第1个日期较小为例设计程序,当输入日期第1个较大时交换两者,确保第1个日期较小
2、从第1个日期开始,循环累计天数,当两个日期相等时就能得到日期差值
当遇到当月天数上限时,天数归1,月份进1,当遇到月份上限时,月份进1,年份加1
3、创建一个二维数组month[13][2]存放每月天数,第1维表示某月天数,第2维表示平年和闰年,
如month[1][0]和month[1][1]分别是1月份平年和闰年的天数。month[0][0]不使用
注:
在VS中结束while循环输入的操作方法
1、按ctrl+z,然后按回车。这个步骤重复3次
2、直接关闭调试控制台
*/
#include<cstdio>
#pragma warning(disable:4996) //允许使用scanf和printf
//判断是否为闰年,如果是返回true
bool isLeap(int year) {
return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}
int main() {
int month[13][2] = {
(0,0),(31,31),(28,29),(31,31),(30,30), //1、2、3、4月平年和闰年天数
(31,31),(30,30),(31,31),(31,31), //5、6、7、8月
(30,30),(31,31),(30,30),(31,31) //9、10、11、12月
};
int time1, y1, m1, d1; //time1是第1个日期,y1、m1、d1是年、月、日
int time2, y2, m2, d2;
while (scanf("%d%d", &time1, &time2) != EOF) { //读取time1和time2日期
if (time1 > time2) { //第1个日期大于第2个,则交换两者
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; //记录2个日期相差的天数
//第1个日期没有达到第2个日期时继续循环统计天数
//即!((y1==y2)&&(m1==m2)&&(d1==d2))
while (y1 < y2 || m1 < m2 || d1 < d2) {
d1++; //天数加1
//当月天数已满,月份进1,天数归1
if (d1 == month[m1][isLeap(y1)] + 1) {
m1++;
d1 = 1;
}
//当年月份已满,年份进1,月份归1
if (m1 == 13) {
y1++;
m1 = 1;
}
ans++; //2个日期相差的天数加1
}
printf("%d\n", ans); //输出相差天数
}
return 0;
}
/*
//两个日期相差较大时,先增加第1个日期的年份,根据平年或闰年直接增加365或366天
//直到与第2个日期年份相差1时停止,然后增加天数、月份,直到两者相等
#include<cstdio>
#pragma warning(disable:4996) //允许使用scanf和printf
//判断是否为闰年,如果是返回true
bool isLeap(int year) {
return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}
int main() {
int month[13][2] = {
{0,0},{31,31},{28,29},{31,31},{30,30}, //1、2、3、4月平年和闰年天数
{31,31},{30,30},{31,31},{31,31}, //5、6、7、8月
{30,30},{31,31},{30,30},{31,31} //9、10、11、12月
};
int time1, y1, m1, d1; //time1是第1个日期,y1、m1、d1是年、月、日
int time2, y2, m2, d2;
while (scanf("%d%d", &time1, &time2)!=EOF) { //读取time1和time2日期
if (time1 > time2) { //第1个日期大于第2个,则交换两者
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; //记录2个日期相差的天数
//先以年份为单位计算日期差值,当y1来到y2前一年时结束循环(y1=y2-1)
while (y1 < y2 - 1) {
if (isLeap(y1)) ans += 366; //y1是闰年,则日期差值加366天
else ans += 365; //y1是平年,则日期差值加365天
y1++; //y1加1进入下一年
}
//然后以天数为单位计算日期差值,当两者日期相等时结束循环
while ((y1 < y2) || (d1 < d2) || (m1 < m2)) {
d1++;
//当天数达到当月上限时,月份进1,天数归1
if (d1 == month[m1][isLeap(y1)] + 1) {
m1++;
d1 = 1;
}
//当月份达到年份上限时,年份进1,月份归1
if (m1 == 13) {
y1++;
m1 = 1;
}
ans++; //日期差值加1
}
printf("%d\n", ans);
}
return 0;
}
*/