分析
1、题型分析:
这道题与我在11.24日发的那篇《最强魔法师》大同小异,也与打鱼晒网问题相似,都是求两个日期的间隔天数。
2、题目分析:
先输入第一个整数n表示本组的测试数据,然后输入n对数据,每对数据由两个日期组成。当输入的数据为0时,循环结束。在这里我选择使用while循环语句。
3、计算思路:
先计算两个日期在该年是第几天(x、y),由于要计算两次,所以用到函数计算第几天,节省代码。然后用一个for循环来计算两个日期间的闰年和平年个数(a、b)。
总间隔天数Allday=a366+b365-x+y。
4、细节注意:
这道题目没有要求输入的两个日期的大小,所以在计算的时候要考虑输入的日期哪个大。
在嵌套循环语句的时候,要注意初始化不要放错位置,不然会导致计算后面的时候,把前面的数也给加上。
题目要求
样例
参考代码
#include<stdio.h>
int DayOfTheYear(long long year, int month, int day); //计算该年的第几天
int main()
{
long long y1, y2, i; //避免y过大
int m1, d1, m2, d2;
int N;
while (scanf("%d", &N),N != 0)
{
while (N--)
{
int Allday, x = 0, y = 0, a = 0, b = 0; //a,b代表y1 y2之间的闰、平年,Allday代表间隔天数
scanf("%lld%d%d", &y1, &m1, &d1);
scanf("%lld%d%d", &y2, &m2, &d2);
x = DayOfTheYear(y1, m1, d1);
y = DayOfTheYear(y2, m2, d2);
if (y1 < y2 || (y1 == y2 && m1 < m2) || (y1 == y2 && m1 == m2 && d1 < d2))
{
for (i = y1; i < y2; i++)
{
if (i % 400 == 0 || (i % 100 != 0 && i % 4 == 0)) //计算平、闰年
a++;
else
b++;
}
Allday = a * 366 + b * 365 - x + y;
}
else if (y1 == y2 && m1 == m2 && d1 == d2)
Allday = 0;
else
{
for (i = y2; i < y1; i++)
{
if (i % 400 == 0 || (i % 100 != 0 && i % 4 == 0)) //计算平、闰年
a++;
else
b++;
}
Allday = a * 366 + b * 365 - y + x;
}
printf("%d\n", Allday);
}
}
return 0;
}
int DayOfTheYear(long long year, int month, int day)
{
int s = 0;
switch (month)
{
case 12:s += 30;
case 11:s += 31;
case 10:s += 30;
case 9:s += 31;
case 8:s += 31;
case 7:s += 30;
case 6:s += 31;
case 5:s += 30;
case 4:s += 31;
case 3:s += 28;
case 2:s += 31;
case 1:s += day;
}
if ((year % 4 == 0 && year % 100 != 0 || year % 400 == 0) && month >= 3)
s++;
return s;
return 0;
}