【Codeup】1928: 日期差值

本文介绍了如何解决Codeup编程题目的日期差值问题,通过逐天累加并处理闰年和月份边界,实现两个给定日期之间的天数计算。给出了样例输入和代码实现,以及单次和多次测试的结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

【Codeup】1928: 日期差值 

题目描述

输入

输出

样例输入

样例输出

思路:

代码:

单次测试:

运行结果:

单次测试:

多次测试:


【Codeup】1928: 日期差值 

题目描述

有两个日期,求两个日期之间的天数,如果两个日期是连续的我们规定他们之间的天数为两天。

输入

有多组数据,每组数据有两行,分别表示两个日期,形式为YYYYMMDD

输出

每组数据输出一行,即日期差值

样例输入


20130101
20130105

样例输出

5

思路:

 直接的做法时让日期不断+1,直到第一个日期等于第二个日期为止,即可统计答案。

代码:

代码中的if 语句 if(d1==month[m1][isLeap(y1)]+1) 中的 +1 是为了判断日期是否达到了当前月份的最后一天。

单次测试:

#include<iostream>
using namespace std;
 
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}
					};			//平年和闰年的每个月的天数
bool isLeap(int year){
	return (year%4==0&&year%100!=0)||(year%400==0);
}

int main(){
	int t1,t2;
	int ant=1;
	int y1,y2,m1,m2,d1,d2;
	scanf("%d %d",&t1,&t2);
	//默认t1为小日期 
	if(t1>t2){
		int temp;
		temp=t1;
		t1=t2;
		t2=temp;
	}
	//t1=20231015
	y1=t1/10000; m1=t1%10000/100; d1=t1%100;
	y2=t2/10000; m2=t2%10000/100; d2=t2%100;
	//d1++
	while(y1<y2||m1<m2||d1<d2){
		d1++;
		if(d1==month[m1][isLeap(y1)]+1){
			//日期变为下一个月的一号
			m1++;
			d1=1; 
		}
		//月数大于12时 
		if(m1==13){
			y1++;
			m1=1; 
		}
		ant++;
	} 
	printf("%d",ant);
	return 0;
}

多次测试:

#include<iostream>
using namespace std;
 
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}};			//平年和闰年的每个月的天数
bool isLeap(int year){
	return (year%4==0&&year%100!=0)||(year%400==0);
}

int main(){
	int t1,t2;
	int y1,y2,m1,m2,d1,d2;
	while(scanf("%d %d",&t1,&t2)!=EOF){
	//默认t1为小日期 
	if(t1>t2){
		int temp;
		temp=t1;
		t1=t2;
		t2=temp;
	}
	//t1=20231015
	y1=t1/10000; m1=t1%10000/100; d1=t1%100;
	y2=t2/10000; m2=t2%10000/100; d2=t2%100;
	int ans=1;
	//d1++
	while(y1<y2||m1<m2||d1<d2){
		d1++;
		if(d1==month[m1][isLeap(y1)]+1){
			//日期变为下一个月的一号
			m1++;
			d1=1; 
		}
		//月数大于12时 
		if(m1==13){
			y1++;
			m1=1; 
		}
		ans++;
	} 
	printf("%d\n",ans);
	}
	return 0;
}

运行结果:

单次测试:

多次测试:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

captain_dong

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值