计算日期差
【问题描述】
结构
struct Date {
int year;
int month;
int day;
};
利用该结构编写一个程序用来计算两个日期之间相差的天数。
【输入形式】
输入两个日期,每个日期分占一行,在一行中日期的年、月、日是三个整数,以空格分隔。并假设第二个日期大于或等于第一个日期。
【输出形式】
第二个日期与第一个日期间相差的天数。
【输入样例】
2003 3 25
2003 3 29
【输出样例】
4
本题目在C语言学习中是一个很常见的练习题,可惜本人已经很久没有写C代码,虽然能够正确输出但是代码较为复杂,可以参考但建议学习更精炼的算法
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct Date {
int year;
int month;
int day;
};
int bissextile[12] = { 31,29,31,30,31,30,31,31,30,31,30,31 };//闰年的每月天数
int common[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 };//平年的每月天数
int leap(int year)
{
if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
return 1;
else
return 0;
}//判断是否为闰年
int main()
{
int i;
struct Date RealDate[2];
for (i = 0; i < 2; i++)
{
scanf("%d%d%d", &RealDate[i].year, &RealDate[i].month, &RealDate[i].day);
}
int scap = 0;
if (RealDate[0].year == RealDate[1].year)//同一年内的情况
{
if (RealDate[0].month == RealDate[1].month)//闰年同年同月的情况
scap = RealDate[1].day - RealDate[0].day;
else if (leap(RealDate[0].year))//同年不同月时
{
scap = bissextile[RealDate[0].month - 1] - RealDate[0].day;
for (i = RealDate[0].month; i < RealDate[1].month - 1; i++)
scap += bissextile[i];
scap += RealDate[1].day;
}//分别将首月,中间月,末月的天数计算相加
else if (!leap(RealDate[0].year))//平年情况同上
{
scap = common[RealDate[0].month - 1] - RealDate[0].day;
for (i = RealDate[0].month; i < RealDate[1].month - 1; i++)
scap += common[i];
scap += RealDate[1].day;
}
printf("%d", scap);
}
else if (RealDate[0].year != RealDate[1].year)//不同年的情况
{
for (i = RealDate[0].year; i < RealDate[1].year; i++)
{
if (leap(i))
scap += 366;
else
scap += 365;
}//先加上首年以及中间年份的日期差
if (leap(RealDate[0].year))
{
if (RealDate[0].month != 1)
for (i = 0; i < RealDate[0].month - 1; i++)
scap -= bissextile[i];
scap -= RealDate[0].day;
}
else if (!leap(RealDate[0].year))
{
if (RealDate[0].month != 1)
for (i = 0; i < RealDate[0].month - 1; i++)
scap -= common[i];
scap -= RealDate[0].day;
}//减去首年日期之前的日期
if (leap(RealDate[1].year))
{
if (RealDate[1].month != 1)
for (i = 0; i < RealDate[1].month - 1; i++)
scap += bissextile[i];
scap += RealDate[1].day;
}
else if (!leap(RealDate[1].year))
{
if(RealDate[1].month != 1)
for (i = 0; i < RealDate[1].month - 1; i++)
scap += common[i];
scap += RealDate[1].day;
}//加上末年的日期
printf("%d\n", scap);
}
return 0;
}