本文主要是介绍P8665 [蓝桥杯 2018 省 A] 航班时间:格式问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题目链接:
P8665 [蓝桥杯 2018 省 A] 航班时间
哎,这道题做了很长时间还是做错了🥀
代码
#include<iostream>
#include<algorithm>
using namespace std;
int get()
{int h1,m1,s1,h2,m2,s2,day=0;scanf("%d:%d:%d %d:%d:%d",&h1,&m1,&s1,&h2,&m2,&s2);if(getchar()==' ')scanf("(+%d)",&day);return (day*86400+h2*3600+m2*60+s2)-(h1*3600+m1*60+s1);
}
int main()
{int T;scanf("%d",&T);while(T--){int ans=(get()+get())/2;printf("%02d:%02d:%02d\n",ans/3600,ans%3600/60,ans%60);}return 0;
}
注意点
①
为了方便计算起飞和降落之间的时间差,我们将单位都换算成秒,最终计算出的是相差的秒数,然后再经过换算得到对应的时间。
这样避免了直接将小时、分钟、秒直接相减得到负数的情况。
②
通过判断下一个字符是否是空格来判断是否隔天。
scanf("%d:%d:%d %d:%d:%d",&h1,&m1,&s1,&h2,&m2,&s2);
if(getchar()==' ')scanf("(+%d)",&day);
因为我们发现如果是隔天,紧跟正常格式输入完之后一定会有一个空格。因此我们将其作为判断标准。
③
飞行时间的求法:
我们将单位换算成秒之后,分别用来和去的降落时间减去起飞时间 得到的结果进行相加再/2得到的就是飞行时间。
因为题目已经假设了往返飞行时间相同,所以两次相减得到的结果应该是相同的,但是由于输入格式要求输入来回两次的起降时间,因此我们get函数不得已执行了两次,所以最后需要两数相加初二来得到答案。
④
当时间为一位数时,要补齐前导零。
这个可以直接利用printf输出格式来实现。
printf("%02d:%02d:%02d\n",ans/3600,ans%3600/60,ans%60);
02 表示输出的整数至少占两位,不足两位时用零填充。
这次做过了一定要记住呀,很省事。
再补充一些
⑥
想再说一下scanf
scanf函数的返回值是成功读取并赋值的项数。如果读取失败,或者在读取第一个项之前就遇到了文件结束符,scanf函数会返回EOF (EOF并不代表0)
当输入的数据与指定的格式不匹配时,scanf会停止读取,并返回已经成功读取并赋值的项数。也就是如果一个都没有成功的读取,那么返回值就是0,表示0项。
在使用scanf进行输入时,通常会忽略前导空白字符(如空格,制表符或换行符)。和cin一样。
这道题写了好久好久。还是写错了😂
有问题欢迎指出,一起加油!!!!
这篇关于P8665 [蓝桥杯 2018 省 A] 航班时间:格式问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!