#include<stdio.h>
int main()
{
/*
输入两个日期(年月日),计算两个日期相差的天数(要考虑闰年)
*/
/*
算法思路:
先计算两个日期之间整年的天数,
比如要计算1993年3月14日到1996年5月3日之间的天数:
则先计算1994年和1995年这两年的总天数:yearDays,
然后计算96年1月1日到96年5月3日的天数:num,
再计算93年3月14日到93年12月31日的天数:n。
则两个日期相差的天数等于yearDays+num+n。
若遇到特殊情况:输入的两个日期为同一年,则最后另外处理(看代码)。
*/
printf("请输入两个日期:");
int year = 0, month = 0, day = 0;// 小日期
int year2 = 0, month2 = 0, day2 = 0;// 大日期
int days = 0,yearDays=0,num=0,n=0;
int i = 0;
int months[] = {
31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
scanf_s("%d %d %d,%d %d %d", &year,&month,&day,&year2,&month2,&day2);
// 先计算中间年份的总天数
for (i=(year+1);i<year2;i++)
{
// 判断是否为闰年
if ((i % 4 == 0 && i % 100 != 0) || i % 400 == 0)
{
// 是闰年
yearDays += 366;
}
else
{
// 不是闰年
yearDays += 365;
}
}
// 判断大日期那年是否是闰年
if ((year2 % 4 == 0 && year2 % 100 != 0) || year2 % 400 == 0)
{
// 是闰年
months[1] = 29;
// 计算大日期那年月日距离大日期那年第一天多少天
for (i = 0; i < (month2 - 1); i++)
{
num += months[i];
}
num = num + day2;
}
else
{
//不是闰年
months[1] = 28;
// 计算大日期那年月日距离大日期那年第一天多少天
for (i = 0; i < (month2 - 1); i++)
{
num += months[i];
}
num = num + day2;
}
// 判断小日期那年是否是闰年
if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
{
//是闰年
months[1] = 29;
// 计算小日期那年的月日距离小日期那年第一天多少天
for (i=0;i<(month-1);i++)
{
n += months[i];
}
n = n + day;
n = 366 - n;
}
else
{
// 不是闰年
months[1] = 28;
// 计算小日期那年的月日距离小日期那年第一天多少天
for (i = 0; i < (month - 1); i++)
{
n += months[i];
}
n = n + day;
n = 365 - n;
}
days = yearDays + num + n;
//特殊情况特殊处理:输入的两个年份相同
if (year == year2)
{
// 判断是否为闰年
if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
{
// 是闰年
n = 366 - n;
}
else
{
// 不是闰年
n = 365 - n;
}
if (num > n)
{
days = num - n;
}
else
{
days = n - num;
}
}
printf("两个日期相差%d天\n",days);
return 0;
}
Example:
If you have a better implementation method, please briefly describe your ideas in the comment area.