[GESP202309 三级] 进制判断
B3868 [GESP202309 三级] 进制判断
题目描述
NNN 进制数指的是逢 NNN 进一的计数制。例如,人们日常生活中大多使用十进制计数,而计算机底层则一般使用二进制。除此之外,八进制和十六进制在一些场合也是常用的计数制(十六进制中,一般使用字母 A 至 F 表示十至十五)。
现在有 NNN 个数,请你分别判断他们是否可能是二进制、八进制、十进制、十六进制。例如,15A6F
就只可能是十六进制,而 1011
则是四种进制皆有可能。
输入格式
输入的第一行为一个十进制表示的整数 NNN。接下来 NNN 行,每行一个字符串,表示需要判断的数。保证所有字符串均由数字和大写字母组成,可能以 000 开头。保证不会出现空行。
保证 1≤N≤10001 \le N \le 10001≤N≤1000,保证所有字符串长度不超过 101010。
输出格式
输出 NNN 行,每行 444 个数,用空格隔开,分别表示给定的字符串是否可能表示一个二进制数、八进制数、十进制数、十六进制数。使用 111 表示可能,使用 000 表示不可能。
例如,对于只可能是十六进制数的 15A6F
,就需要输出 0 0 0 1
;而对于四者皆有可能的 1011
,则需要输出 1 1 1 1
。
输入输出样例 #1
输入 #1
2
15A6F
1011
输出 #1
0 0 0 1
1 1 1 1
输入输出样例 #2
输入 #2
4
1234567
12345678
FF
GG
输出 #2
0 1 1 1
0 0 1 1
0 0 0 1
0 0 0 0
【题目分析】
- 本题是多组数据,多组输出,针对每组测试数据,判断是否可以表示二进制、八进制、十进制、十六进制的数字,如果数字中只有0和1,那么这个数能表达所有进制的数据,即输出1 1 1 1。
- 如果数字中的数字存在2−72-72−7的数字,并且没有超过7的数字存在,那么这个数可以表达八进制数、十进制数和十六进制数,即输出0 1 1 1。
- 如果这个数存在8−98-98−9的数字,并且没有超过9的数字存在,那么这个数可以表达十进制数,十六进制数,即输出0 0 1 1。
- 如果这个数字存在A−FA-FA−F的数字,并且没有超过F的数字存在,那么这个数可以表达十六进制数,即输出0 0 0 1。
- 如果这个数字存在比F大的数字,那么这个数不可以表达这四个进制中的任何一个数,即输出0 0 0 0。
- 本题中有存在字符的输入,输入数据类型为string。
【代码展示】
#include<bits/stdc++.h>
using namespace std;
int n,f,l;
string a;
int main()
{cin>>n;while(n--)//循环n次 {cin>>a;//输入一个进制数f=0;//标记变量fl=a.size();//获取字符串长度 for(int i=0;i<l;i++){if(a[i]>='0'&&a[i]<='1'&&f<2)//数据存在0和1,并且没有标记其它进制 {f=2;//标记变量为2进制 }else if(a[i]>='2'&&a[i]<='7'&&f<8)//数据存在 2~7的数,并且标记了比八进制小的进制{f=8;//标记变量为8进制 }else if(a[i]>='8'&&a[i]<='9'&&f<10)//数据存在 8~9的数,并且标记了比十进制小的进制{f=10;//标记变量为十进制 }else if(a[i]>='A'&&a[i]<='F'&&f<16)//数据存在 A~F的数,并且标记了比十六进制小的进制{f=16;//标记变量为十进制 } else if(a[i]>'F')//数据存在比F大的其它字符 {f=100;//标记变量为更大的进制,无法表达题目中的四个进制 } } if(f==2)//能表达二进制就能表达八进制、十进制、十六进制 {cout<<"1 1 1 1\n"; }else if(f==8){cout<<"0 1 1 1\n"; } else if(f==10){cout<<"0 0 1 1\n";}else if(f==16){cout<<"0 0 0 1\n";}else if(f==100){cout<<"0 0 0 0\n";}}return 0;
}