比较简单的一题,但是有很多细节,首先就是年份的输入处理,非常巧妙
y1 = time1 / 10000, m1 = time1 % 10000 / 100, d1 = time1 % 100;
还有闰年的处理,按照我的逻辑代码需要很多行,而按照第二种处理方法,也就是数组多打几个元素而已,却大大缩短了代码量,还不容易出错,值得学习。
1.我的代码
//问题 A: 日期差值
//最直接的模拟,计算机可以代替我们做简单的重复操作,只需要告诉其规则即可
#include <cstdio>
int month[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
int main()
{
//首先将日期信息顺利读入
int time1, y1, m1, d1;
int time2, y2, m2, d2;
scanf("%d%d", &time1, &time2);
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;
bool flag = false;
int sum = 1;
while (y1<y2||m1<m2||d1<d2)//等价于(y1!=y2&&m1!=m2&&d1!=d2)
{
if (y1 % 4 == 0 && y1 % 100 != 0 || y1 % 400 == 0)//判断是否是闰年
flag = true;
else
flag = false;
d1++;
sum++;
if (!flag)
{
if (d1 > month[m1])
{
d1 = 1;
m1++;
}
}
else//是闰年
{
if (m1 == 2) {
if (d1 > month[m1]+1)//d1>29
{
d1 = 1;
m1++;
}
}
else
{
if (d1 > month[m1]) {
d1 = 1;
m1++;
}
}
}
if (m1 == 13) {//月份和年份
m1 = 1;
y1++;
}
}
printf("%d\n", sum);
return 0;
}
2.标准答案
/问题 A: 日期差值
//最直接的模拟,计算机可以代替我们做简单的重复操作,只需要告诉其规则即可
#include <cstdio>
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}};
int isLeap(int y1)
{
if (y1 % 4 == 0 && y1 % 100 != 0 || y1 % 400 == 0) return 1;
else return 0;
}
int main()
{
//首先将日期信息顺利读入
int time1, y1, m1, d1;
int time2, y2, m2, d2;
scanf("%d%d", &time1, &time2);
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 sum = 1;
while (y1<y2||m1<m2||d1<d2)//等价于(y1!=y2&&m1!=m2&&d1!=d2)
{
d1++;
if (d1 > month[m1][isLeap(y1)]) {
d1 = 1;
m1++;
}
if (m1 == 13) {
m1 = 1;
y1++;
}
sum++;
}
printf("%d\n", sum);
return 0;
}