C++求日期差值题目

C++日期差值题目(牛客网)题目超链接

仅个人思路不是最优解
在这里插入图片描述

仔细阅读地题目,要求输入连续的两串数字表示两个日期
所以我感觉日期类不太方便(也许是我实力不允许)
cin使用起来就不太方便,我这里选择使用scanf,通过scanf的机制我们取到日期1和日期二的年月日。

int _year1, _year2, _month1, _month2, _day1, _day2;
	int _arr[] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
	scanf("%4d%2d%2d", &_year1, &_month1, &_day1);
	scanf("%4d%2d%2d", &_year2, &_month2, &_day2);
	int maxy, maxm, maxd, miny, minm, mind;

顺便这里定义一个数组,用来方便取到不同月份的天数。
然后我们为了处理不知道那个日期大,另外我们在定义一个用来存放大小年月日的变量。

int main()
{
	int _year1, _year2, _month1, _month2, _day1, _day2;
	int _arr[] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
	scanf("%4d%2d%2d", &_year1, &_month1, &_day1);
	scanf("%4d%2d%2d", &_year2, &_month2, &_day2);
	int maxy, maxm, maxd, miny, minm, mind;
	 //因为函数只能有一个返回值,所以我写了两个函数,有更好的方法望交流
	maxy = JuageBig(_year1, _year2); //取大年
	miny = JuageSmall(_year1, _year2);//取小年
	maxm = JuageBig(_month1, _month2);//取大月
	minm = JuageSmall(_month1, _month2);//取小月
	int n = 0;//这个变量在后面就知道了
	int ab = _day1 - _day2;
	int abc = abs(ab);//取绝对值
	if (abc == 1) //最特别的情况如果是相邻的两天我们直接输出2
	{
		cout << 2 << endl;
	}
	else
	{
		//如果不是相邻的两天我们就会进来
		if (_year1 != _year2)
		{
			//先判断年,年不相等我们需要先调整年在往下继续调整
			while (maxy > miny)
			{
				if (maxy == _year1)
				{
					//如果大年是_year1
					_day1 += Juageyear(maxy--);//哪个是大年我们这里就判断一下是不是闰年在--,在转化成天数加在_day里
				}
				else {
					//同理
					_day2 += Juageyear(maxy--);
				}
			}
			while (maxm > minm)
			{
				//如果走到这里说明年已经相等了
				//开始判断月份
				if (maxm == _month1)
				{
					//跟年同理,但是月份这里我们需要取数组里的数据,这里要注意取的是给出月份的上一个月,转化成天数
					_day1 += _arr[--maxm];
				}
				else {
					_day2 += _arr[--maxm];
				}
			}
			//经过重重关卡,我们走到了这里,意味着年和月份都已经一样了
			maxd = JuageBig(_day1, _day2);
			mind = JuageSmall(_day1, _day2);
			while (maxd > mind) {
				//这样成本比较低
				//只要大的天数减一天,n就++
				//这里要注意因为我们这里是>所以最后输出需要加1,不然就会少一天
				maxd--;
				n++;
			}
		}
		else {
		//这里是用来处理第一层判断的,原理是一样的
			while (maxm > minm)
			{
				if (maxm == _month1)
				{
					_day1 += _arr[--maxm];
				}
				else {
					_day2 += _arr[--maxm];
				}
			}
			maxd = JuageBig(_day1, _day2);
			mind = JuageSmall(_day1, _day2);
			while (maxd > mind) {
				maxd--;
				n++;
			}
		}
		cout << n+1 << endl;//最终输出结果
	}
	return 0;
}

这里我们的整体思路就是将年月不同多出来的日期都转化为天数,最终比较天数,在使用计数的方法计算出差值。

#include<iostream>
#include<cmath>
using namespace std;

int Juageyear(int year)
{
	int tyear = year - 1;
	if ((tyear % 4 == 0 && tyear % 100 != 0) || tyear % 400 == 0)
	{
		return 366;
	}
	else {
		return 365;
	}
}

int JuageBig(int a, int b)
{
	if (a > b)
		return a;
	else
		return b;
}
int JuageSmall(int a, int b)
{
	if (a < b)
		return a;
	else
		return b;
}

这是前面的一些简单的比大小和计算润年的代码,比较简单就不做讲解啦!
(作者思路,不是最佳解)谢谢大家!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值