文章

【GESP】C++三级真题 luogu-B3868 [GESP202309 三级] 进制判断

GESP三级真题,字符串和一维数组相关,难度★★☆☆☆。

luogu-B3868 [GESP202309 三级] 进制判断

题目要求

题目描述

$N$ 进制数指的是逢 $N$ 进一的计数制。例如,人们日常生活中大多使用十进制计数,而计算机底层则一般使用二进制。除此之外,八进制和十六进制在一些场合也是常用的计数制(十六进制中,一般使用字母 A 至 F 表示十至十五)。

现在有 $N$ 个数,请你分别判断他们是否可能是二进制、八进制、十进制、十六进制。例如,15A6F 就只可能是十六进制,而 1011 则是四种进制皆有可能。

输入格式

输入的第一行为一个十进制表示的整数 $N$。接下来 $N$ 行,每行一个字符串,表示需要判断的数。保证所有字符串均由数字和大写字母组成,可能以 $0$ 开头。保证不会出现空行。

保证 $1 \le N \le 1000$,保证所有字符串长度不超过 $10$。

输出格式

输出 $N$ 行,每行 $4$ 个数,用空格隔开,分别表示给定的字符串是否可能表示一个二进制数、八进制数、十进制数、十六进制数。使用 $1$ 表示可能,使用 $0$ 表示不可能。

例如,对于只可能是十六进制数的 15A6F,就需要输出 0 0 0 1;而对于四者皆有可能的 1011,则需要输出 1 1 1 1

输入输出样例 #1

输入 #1

1
2
3
2
15A6F
1011

输出 #1

1
2
0 0 0 1
1 1 1 1

输入输出样例 #2

输入 #2

1
2
3
4
5
4
1234567
12345678
FF
GG

输出 #2

1
2
3
4
0 1 1 1
0 0 1 1
0 0 0 1
0 0 0 0

题目分析

解题思路

本题的解题思路可以分为以下几个步骤:

  1. 读取输入数据:
    • 读取需要处理的数字个数N
    • 循环N次,每次读取一个待判断的字符串
  2. 对每个字符串进行判断:
    • 初始化4个标志位,分别表示二进制、八进制、十进制、十六进制的可能性,初始值都为1
    • 遍历字符串的每个字符:
      • 如果字符大于’1’,则不可能是二进制
      • 如果字符大于’7’,则不可能是八进制
      • 如果字符大于’9’,则不可能是十进制
      • 如果字符大于’F’,则不可能是十六进制
  3. 输出结果:
    • 对每个字符串,输出4个数字,用空格分隔
    • 1表示可能是该进制,0表示不可能是该进制

举例说明: 对于输入字符串”15A6F”:

  • 包含>1的字符,不是二进制,输出0
  • 包含>7的字符,不是八进制,输出0
  • 包含非数字字符,不是十进制,输出0
  • 所有字符都在0-9和A-F范围内,是十六进制,输出1 最终输出:0 0 0 1

复杂度分析:

  • 时间复杂度:$O(N×L)$,其中N是字符串个数,L是字符串的最大长度
  • 空间复杂度:$O(1)$,只需要常数级别的额外空间


示例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include <iostream>
#include <string>

int main() {
    // 读取需要处理的数字个数
    int n;
    std::cin >> n;
    
    // 处理每个输入的数字
    for (int i = 0; i < n; i++) {
        std::string str;
        std::cin >> str;
        
        // 初始化结果数组,分别表示二进制、八进制、十进制、十六进制的可能性
        int result[4] = {1, 1, 1, 1};
        
        // 遍历字符串的每个字符
        for (int j = 0; j < str.length(); j++) {
            // 检查是否可能是二进制数(只能包含0和1)
            if (str[j] > '1') {
                result[0] = 0;
            }
            // 检查是否可能是八进制数(只能包含0-7)
            if (str[j] > '7') {
                result[1] = 0;
            }
            // 检查是否可能是十进制数(只能包含0-9)
            if (str[j] > '9') {
                result[2] = 0;
            }
            // 检查是否可能是十六进制数(只能包含0-9和A-F)
            if (str[j] > 'F') {
                result[3] = 0;
            }
        }
        
        // 输出结果
        for (int j = 0; j < 4; j++) {
            std::cout << result[j] << " ";
        }
        std::cout << "\n";
    }
    return 0;
}

所有代码已上传至Github:https://github.com/lihongzheshuai/yummy-code

GESP各级别考纲要点、知识拓展和练习题目清单详见C++学习项目主页

luogu-”系列题目已加入洛谷Java、C++初学团队作业清单,可在线评测,团队名额有限,欢迎加入。

bcqm-”系列题目可在编程启蒙题库进行在线评测。

本文由作者按照 CC BY 4.0 进行授权