题解:P14583 彩绘标志

· · 题解

这题很简单,先不看输入格式,题意可以翻译为:如果 b\ge a 则输出 1,如果 b<a 则输出 0

那么现在看一下输入格式。发现输入格式带有非数字字符,那么就要对字符进行处理。以下介绍几种方法处理输入。

方法 1:scanf

scanf 是一个功能很强大的输入函数。它不仅可以输入单一的整数、字符、无空格字符串,还可以输入指定字符集的内容,甚至整行字符串(代替 fgets),就是速度有点慢。不过用在这题绰绰有余。

我们可以用 scanf("%dg %dg", &a, &b); 来读入。其中 %d 表示读入一个整数到变量中,%dg 表示在读入整数后面紧跟着读入字符 g%dg %dg 表示在读入两个“整数 +g”之间用若干个空格或其它空白符隔开。

完整代码:

#include <cstdio>
int main(){
    int a, b;
    scanf("%dg %dg", &a, &b);
    if (a > b){
        printf("0");
    }
    else{
        printf("1");
    }
    return 0;
}

方法 2:cin

使用 cin 一样可以分别输入整数和字符。可以使用 cin>>digit>>c 的形式来输入一个整数加一个字符。cin 读取东西的时候会自动过滤空格,所以两个“整数 +g”之间不需要再额外读入空格。

ios::sync_with_stdio(false); 语句和 cin.tie(NULL); 语句可以用来提升 cin 的读入速度。当然本题可以不使用。建议在正式比赛当中使用,不要敲错。如果有 freopen,最好将这两条语句写在 freopen 的后面。

完整代码:

#include <iostream>
using namespace std;
int main(){
    int a, b;
    char g1, g2;
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cin >> a >> g1 >> b >> g2;
    if (a > b){
        cout << 0;
    }
    else{
        cout << 1;
    }
    return 0;
}

方法 3:快速读入

手写的快读可以选择只读入数字字符而忽略非数字字符。由于数字字符都是按从小到大顺序紧挨在一起的,所以数字字符的范围为字符 0 到字符 9,非数字字符的范围就扣除掉数字字符的范围。

快速读入一般使用 getchar 函数即可。在【模板】快速读入中使用 getchar 则会超时,但那与本题无关。此题用 getchar 即可。

完整代码:

#include <cstdio>
using namespace std;
int read(){
    int x = 0;
    int c = getchar();
    while (c < '0' || c > '9'){//非数字字符
        c = getchar();//直接跳过读新字符
    }
    while (c >= '0' && c <= '9'){//数字字符
        x = x * 10 + (c - '0');
        c = getchar();
    }
    return x;
}
int main(){
    int a = read(), b = read();
    if (a > b){
        putchar('0');
    }
    else{
        putchar('1');
    }
    return 0;
}

以上就是常用的三种读入方法,希望对你有所帮助。