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;
}
这是前面的一些简单的比大小和计算润年的代码,比较简单就不做讲解啦!
(作者思路,不是最佳解)谢谢大家!