航班时间( scanf的巧妙用法 )
技巧:
scanf("%d(+%d)%d", &a, &b, &c);
对于空白字符:空格、tab、回车等,scanf将忽略输入字符串的空白字符,
直到下一个非空白字符,(并回放该非空白字符),
若该非空白字符与格式化字符串匹配,则读入(例如:scanf("%d(+%d)%d", &a, &b, &c) 若输入1(+2)3则可以读入)
若该非空白字符与格式化字符串不匹配,则结束此次读取,
并将该非空白字符回存到缓存中,在下一次读取函数被调用时读取(如scanf、getchar等)根据秒t在O(1)时间内计算出时分秒: t/3600, t/60%60, t%60
t/60得到分钟数,%60相当于去掉小时数
测试:在该代码中,输入[1:2 3] 输出1 2 3 。输入[1 2 3],则输出102,
原因:输入1 2 3时,2不符合第一个scanf的输入格式,此次输入结束,2进入下一个scanf,3没有读入
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int main()
{
int a, b, c;
scanf("%d:%d", &a, &b);
scanf("%d", &c);
printf("%d %d %d", a ,b, c);
return 0;
}
思路:
A地出发时间+飞行时间+时差=B地降落时间
B地出发时间+飞行时间-时差=A地降落时间
时差可能为正,也可能为负
AC代码:
#include<bits/stdc++.h>
using namespace std;
int getTime(void)
{
int h1,m1,s1,h2,m2,s2,d=0;
scanf("%d:%d:%d %d:%d:%d (+%d)",&h1,&m1,&s1,&h2,&m2,&s2,&d);
int time=d*24*3600+h2*3600+m2*60+s2-(h1*3600+m1*60+s1);
return time;
}
int main()
{
int t;
scanf("%d",&t);
for(int i = 0; i < t; i++)
{
int time1=getTime();
int time2=getTime();
int t=(time1+time2)/2;
printf("%02d:%02d:%02d\n", t/3600, t/60%60, t%60);
}
return 0;
}