(CodeupC语言)1928日期差值
日期差值
题目描述
有两个日期,求两个日期之间的天数,如果两个日期是连续的我们规定他们之间的天数为两天。
输入
有多组数据,每组数据有两行,分别表示两个日期,形式为YYYYMMDD
输出
每组数据输出一行,即日期差值
样例输入
20130101 20130105
样例输出
5
这个题没什么好说的就是很麻烦就对了。。。
首先明确一下:
闰年:
普通闰年:能被4整除但不能被100整除的年份为普通闰年。(如2004年就是闰年,1999年不是闰年);
世纪闰年:能被400整除的为世纪闰年。(如2000年是世纪闰年,1900年不是世纪闰年);if((i%4 == 0 && i%100 != 0) || (i%400 == 0))
是闰年,366天,2月29号;
else
是平年/正常年,365天,2月28号;
先贴上正确代码:
哦,codeup没用过,不知道咋回事,一直提交不上去,但是计算结果应该是对的;
而且吐槽一下叫“codeup墓地”是因为原网站挂了吗,现在的好像是某位大神私人搭建的?
#include <stdio.h>
#include <stdlib.h>
int month[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
int main()
{
int dateA,dateB;
scanf("%d%d",&dateA,&dateB);
//保证后面的比前面的那个大
int temp =0;
if(dateA>dateB)
{
temp = dateA;
dateA = dateB;
dateB = temp;
}
//先处理输入,把年月日提出来
int yearA,monthA,dayA,yearB,monthB,dayB;
yearA = dateA/10000;
monthA = (dateA/100)%100;
dayA = dateA%100;
yearB = dateB/10000;
monthB = (dateB/100)%100;
dayB = dateB%100;
//输出一下输入处理的对不对
//printf("%d-%d-%d\n",yearA,monthA,dayA);
//printf("%d-%d-%d\n",yearB,monthB,dayB);
//---------------------------------------------------------------------------------------
int tYear=yearA,tMonth=monthA,tDay=dayA;
int differ = 1;
//按天走
//比如2018-02-01到2019-01-17
//天满进月,月满进年,一直到等于B为止
while(tYear != yearB || tMonth!=monthB || dayB!=tDay)
{
if((tYear%4 == 0 && tYear%100 != 0) || (tYear%400 == 0))
month[1]=29;
else
month[1]=28;
tDay++;
differ++;
//printf("%d\t",tDay);
if(tDay==month[tMonth-1])
{
tMonth++;
tDay = 1;
differ++;
//printf("\n月++,月=%d\n",tMonth);
if(tMonth==13)
{
if(tYear==yearB){
differ--;
break;
}
tYear++;
tMonth=1;
//printf("\n年++,年=%d\n",tYear);
}
}
}
//---------------------------------------------------------------------------------------
//printf("\n相差%d天\n",differ);
printf("%d",differ);
return 0;
}
这个代码的思路:
用month存了一下各个月份的天数(后面的monthA、monthB是输入的AB两个日期的月份,起名不规范,调试两行泪)
PS:其中我的闰年处理是放到year++的那一部分了,因为变的只有2月的天数,所以说反复赋值不违背道德吧。
首先将输入的两个数字处理一下,比较一下让A日期在B日期的前面。之后提取出分别的年月日来,存一下;
然后开始计算日期差值:这个方法是从日期A开始一直++,一直加到==日期B,当然需要一个记数变量。每次day加到月底就让月份month加一,每次month到年底就year++(大概类似于进制进位吧)。日->月->年。
Last,输出,完事儿了。
为什么这个题用了这么长时间呢,因为一上来思路不是这个。这个是看了《算法笔记》才知道的思路。
我一开始的思路是分情况讨论:如下
//处理:要分情况讨论吗
//20120101与20120102之间是2,也就是dayB-dayA+1
/*年月日相同
同年同月不同日
同年不同月同日
同年不同月不同日不同年同月同日
不同年同月不同日
不同年不同月同日
不同年不同月不同日*/
这个逻辑是使用加法,(A月底-A日期)+(B月-1 - A月+1)+(B月日期-B月1号)
也就是说,A月的一部分+AB中间月的天数+B月的天数。当然年数也是如此,只不过把天数换成月数,月数换成年数。
于是开始写代码。。哇这个逻辑好像挺清晰,但是实际上。。。而且我后来想要优化代码,把代码整啊整啊最后gg了,连自己都不知道在写什么了。。。混乱的一批
把丢人代码也贴在这里当个教训吧:
#include <stdio.h>
#include <stdlib.h>
int month[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
int main()
{
int i;
int dateA,dateB;
scanf("%d%d",&dateA,&dateB);
//保证后面的比前面的那个大
int temp =0;
if(dateA>dateB)
{
temp = dateA;
dateA = dateB;
dateB = temp;
}
//先处理输入,把年月日提出来
int yearA,monthA,dayA,yearB,monthB,dayB;
yearA = dateA/10000;
monthA = (dateA/100)%100;
dayA = dateA%100;
yearB = dateB/10000;
monthB = (dateB/100)%100;
dayB = dateB%100;
printf("%d-%d-%d\n",yearA,monthA,dayA);
printf("%d-%d-%d\n",yearB,monthB,dayB);
//处理:要分情况讨论吗
//20120101与20120102之间是2,也就是dayB-dayA+1
/*年月日相同
同年同月不同日
同年不同月同日
同年不同月不同日
不同年同月同日
不同年同月不同日
不同年不同月同日
不同年不同月不同日
其实最后一种可以包括以上所有吧。。。。
*/
int differ=1;
//普通闰年:能被4整除但不能被100整除的年份为普通闰年。(如2004年就是闰年,1999年不是闰年);
//世纪闰年:能被400整除的为世纪闰年。(如2000年是世纪闰年,1900年不是世纪闰年);
//因为前面交换了,所以说这里只有a小于b或者a==b
if(yearA < yearB)
{
if(monthB>=monthA&& dayB>dayA)
{
for(i=yearA; i<yearB; i++)
{
if((i%4 == 0 && i%100 != 0) || (i%400 == 0))
{
differ += 366;
}
else
{
differ += 365;
}
}
}
else{
for(i=yearA+1; i<yearB; i++)
{
if((i%4 == 0 && i%100 != 0) || (i%400 == 0))
{
differ += 366;
}
else
{
differ += 365;
}
}
}
}
//----------------------------------------------------------上面有问题
if(monthA==monthB)
{
if(dayA == dayB)
differ = 0;
else
differ = differ+ dayB - dayA;
}
else
{
if(monthB>monthA)
for(i = monthA+1; i<monthB; i++)
differ += month[i];
else
{
for(i = monthA+1; i<12; i++)
differ += month[i];
for(i=0; i<monthB; i++)
differ +=month[i];
}
}
if(dayA!=dayB)
{
//例如3月15到6月18,就是3.31-15,+4.day+5.day,+6.18;
differ += month[monthA]-dayA;
differ += dayB;
}
/*if(yearB- yearA>1){
for(i=yearA;i<yearB;i++)
{
if((i%4 == 0 && i%100 != 0) || (i%400 == 0)))
{
differ += 366;
}
else{
differ += 365;
}
}
}
if(monthB-monthA>1)
{
for(i=monthA+1;i<monthB-1;i++){
}
}
*/
printf("%d年%d月%d日与%d年%d月%d日之间相差:",yearA,monthA,dayA,yearB,monthB,dayB);
printf("%d天",differ);
return 0;
}
如果日后有空我来把它当做逻辑题来练练脑子也行哈==因为脑子本来就笨,不给我个笔我连3位数的加减法都算不出来。。。
这个速度刷题,好慢啊遥遥无期。。。丢skr人