现在有一个数,请你分别判断它们是否可能是二进制、八进制、十进制、十六进制。例如,6AFF 就只可能是十六进制,而 $1011$ 则是四种进制皆有可能。输入 $N$(保证 $1 \le N \le 100$),表示有 $N$ 个数让你进行判断,接下来输入 $N$ 个字符串(保证所有字符串长度不超过 $10$),判断可能是四个进制当中的哪个进制数。输出 $N$ 行,每行 $4$ 个数,用空格隔开,分别表示给定的字符串是否可能表示一个二进制数、八进制数、十进制数、十六进制数。使用 $1$ 表示可能,使用 $0$ 表示不可能。下面程序横线处可以满足这个要求的是( )。
#include <iostream>
using namespace std;
int main() {
int n = 0;
cin >> n;
for (int i = 0; i < n; i++) {
char str[11];
cin >> str;
char max = '0';
for (int i = 0; str[i] != '\0'; i++)
if (str[i] > max)
max = str[i];
___________________________________________
}
return 0;
}答案B。考点: 循环结构——for/while的执行与嵌套。
关键提醒:C++中的^是异或运算符,不是乘方!2^5=7而非32。这是最高频的错误。
【考点】进制范围判断|字符比较逻辑|ASCII 顺序利用
考纲定位 GESP 三级“数据表示与编码”模块,命题人故意卡在“进制判断只依赖最大字符”这一认知盲区。多数学生背了“二进制只有 0 和 1"却忽略范围本质,导致选项 A 的 >= 误选。命题人放这道题,就是卡住“只记结论不记本质”的弱点。
解题思维 进制合法性本质是“所有字符落在区间内”。二进制区间 [0,1]、八进制 [0,7]、十进制 [0,9]、十六进制 [0,9,A-F]。代码已遍历找出最大字符 max,因此只需判断 max 是否 ≤ 各进制上限。max <= '1' 即二进制可能,同理其余三个,对应选项 B。
陷阱拆解 A 用 >=:当 max='0' 时 max >= '1' 为假,但二进制仍合法,错在方向反了。C 用赋值 =:表达式值非布尔,且无判断意义。D 用 <:max='1' 时 < '1' 为假,漏掉合法情况。命题人利用 ASCII 顺序——'F' 大于 '9',故 max <= 'F' 自然涵盖 A-F 和 0-9。
反命题思维 若改成“给定进制验证字符串”或“判断是否全为某字符”,答案将完全不同。刷到类似题时先问“命题人想考范围还是考存在性”,再决定用 <= 还是 ==。