Codeup1928 日期差值

比较简单的一题,但是有很多细节,首先就是年份的输入处理,非常巧妙

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;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值