航班时间( scanf的巧妙用法 )

题目链接:1231. 航班时间 - AcWing题库

技巧:

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;
}

posted @ 2022-05-05 08:41  光風霽月  阅读(26)  评论(0编辑  收藏  举报