2018年蓝桥杯软件类省赛(软件类)C/C++大学A组第6题“航班时间”,一道法式设想题。
*本文内容由倪文迪(华东理工大学计算机系软件192班)和罗勇军教师供给。
01
标题问题描述
2018省赛A组第6题“航班时间” ,标题问题链接:
已知从A地飞往B地,再从B地返回A地的起飞和下降时间(本地时间),计算单程飞翔时间。重视有时差。
输进:
一个输进包罗多组数据。
输进第一行为一个正整数T,表达输进数据组数。
每组数据包罗两行,第一行为往程的 起降 时间,第二行为回程的 起降 时间。
起降时间的格局如下
h1: m1:s1 h2: m2:s2
h1: m1:s1 h3: m3:s3 (+ 1)
h1: m1:s1 h4: m4:s4 (+ 2)
表达该航班在本地时间h1时m1分s1秒起飞,
第一种格局表达在本地时间 当日 h2时m2分s2秒下降
第二种格局表达在本地时间 次日 h3时m3分s3秒下降。
第三种格局表达在本地时间 第三天 h4时m4分s4秒下降。
关于此标题问题中的所有以 h:m:s 形式给出的时间, 包管 ( 0=h=23, 0=m,s=59 ).
包管输进时间合法,飞翔时间不超越24小时。
输出:
关于每一组数据输出一行一个时间hh:mm:ss,表达飞翔时间为hh小时mm分ss秒。
重视,其时间为一位数时,要补齐前导零。如三小时四分五秒应写为03:04:05。
样例输进:
3
17:48:1921:57:24
11:05:1815:14:23
17:21:0700:31:46(+ 1)
23:02:4116:13:20(+ 1)
10:19:1920:41:24
22:19:0416:41:09(+ 1)
样例输出:
04 :09:05
12 :10:39
14 :22:05
02
题解
本题的逻辑不复杂,次要查核输进和输出。
(1)飞翔时间的计算
设起飞时间是S,抵达时间是E,单程飞翔时间是X,时差是T。
从A到B:S1+X+T=E1
从B到A:S1+X-T=E2
整理两式得:2X=(E1-S1) + (E2-S1),谜底就是X。
可见,其实不需要计算时差T,因为一往一回,互相抵消了。
(2)输进输出
那是本题查核的次要内容。差别语言的实现见下面的代码。
03
C代码
C风气的输进输出。重视scanf和printf的利用。
# includestdio.h
intget_time{
inth1,h2,m1,m2,s1,s2;
scanf( "%d:%d:%d %d:%d:%d",h1,m1,s1,h2,m2,s2); //读时间
intday = 0; //处置跨天
if((getchar)!= '\n')
scanf( "(+%d)",day);
intS = h1* 3600+ m1* 60+ s1; //起飞时间:转为秒
intE = h2* 3600+ m2* 60+ s2; //抵达时间:转为秒
returnE - S + day* 24* 3600; //返回秒
intmain{
intn;
scanf( "%d",n);
while(n--){
intans =(get_time + get_time)/ 2;
printf( "%02d:%02d:%02d\n",ans/ 3600,ans/ 60% 60,ans% 60); //时:分:秒
return0;
04
C++代码
用C++的string读取和处置字符串,用getline一次读取一行。
# includebits/stdc++.h
usingnamespacestd;
intget_time{
stringline;
getline( cin, line); //读一行
if(line.back != ')') line += " (+0)";
inth1, m1, s1, h2, m2, s2, day;
sscanf(line.c_str, "%d:%d:%d %d:%d:%d (+%d)", h1, m1, s1, h2, m2, s2, day);
intS = h1* 3600+ m1* 60+ s1; //起飞时间:转为秒
intE = h2* 3600+ m2* 60+ s2; //抵达时间:转为秒
returnE - S + day* 24* 3600; //返回秒
intmain{
stringline;
getline( cin, line);
intn;
sscanf(line.c_str, "%d", n); //读第一行的组数n
while(n--) {
intans =(get_time + get_time)/ 2;
printf( "%02d:%02d:%02d\n",ans/ 3600,ans/ 60% 60,ans% 60); //时:分:秒
05
Java代码
Java能够间接用Date处置时间。
importjava.util.*;
importjava.io.*;
importjava.text.*;
publicclassMain{
privatestaticScanner sc = newScanner(System.in);
publicstaticvoidmain(String[] args)throwsParseException {
intn = sc.nextInt;
sc.nextLine;
for( inti = 0; in;i++){
longans = (getTime+getTime)/ 2;
System.out.printf( "%02d:%02d:%02d\n",ans/ 3600,ans/ 60% 60,ans% 60);
privatestaticlonggetTimethrowsParseException {
String s = sc.nextLine;
String[] split = s.split( " ");
SimpleDateFormat f = newSimpleDateFormat( "HH:mm:ss");
Date t1 = f.parse(split[ 0]);
Date t2 = f.parse(split[ 1]);
intd = 0;
if(split.length == 3){
d = Integer.parseInt(split[ 2].substring( 2, 3));
returnd* 24* 3600+t2.getTime/ 1000-t1.getTime/ 1000;
06
Python代码
看看Python若何处置一行字符串。
def get_time:
line= str( input). split( ' ') #一行字符串,以空格分隔,别离读取
h1= int( line[ 0][ 0: 2]) #处置字符串中的数字
m1= int( line[ 0][ 3: 5])
s1= int( line[ 0][ 6: 8])
h2= int( line[ 1][ 0: 2])
m2= int( line[ 1][ 3: 5])
s2= int( line[ 1][ 6: 8])
day = 0
if( len( line)== 3): #line中有 3个元素,最初一个是day
day = int( line[ 2][ 2])
S = h1* 3600+ m1* 60+ s1
E = h2* 3600+ m2* 60+ s2
returnE - S + day* 24* 3600
n = int( input)
fori in range(n):
ans = (get_time+ get_time)/ 2
hh = int(ans/ 3600)
mm = int(ans/ 60% 60)
ss = int(ans% 60)
print( "{:02d}:{:02d}:{:02d}".format(hh,mm,ss))
07
参考册本