B3868 [GESP202309 三级] 进制判断

文章描述了一种编程问题,要求编写代码来判断输入的字符串是否能表示为二进制、八进制、十进制或十六进制数,通过定义并使用四个判断函数实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

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

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

输入格式

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

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

输出格式

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

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

输入输出样例

输入 #1

2
15A6F
1011

输出 #1

0 0 0 1
1 1 1 1

输入 #2

4
1234567
12345678
FF
GG

输出 #2

0 1 1 1
0 0 1 1
0 0 0 1
0 0 0 0

直接上代码

这道题其实非常简单,考的就是循环加判断,直接定义四个函数,分别判断他们是不是就可以啦

bool is_bin(string n){
    for(int i=0;i<n.length();i++){
        if(n[i]<'0' || n[i]>'1') return false;
    }
    return true;
}
bool is_oct(string n){
    for(int i=0;i<n.length();i++){
        if(n[i]<'0'|| n[i]>'7') return false;
    }
    return true;
}
bool is_dec(string n){
    for(int i=0;i<n.length();i++){
        if(n[i]<'0' || n[i]>'9') return false;
    }
    return true;
}
bool is_hex(string n){
    for(int i=0;i<n.length();i++){
        if(n[i]>'9' && n[i]<'A'|| n[i]<'0' || n[i]>'F') return false;
    }
    return true;
}

然后就是一大串的if else条件句判断

    for(int i=0;i<k;i++){
        string str;
        cin>>str;
        if(is_bin(str)) {
            cout<<1<<" "<<1<<" "<<1<<" "<<1<<endl;
        }
        else{
            if(is_oct(str)) {
                cout<<0<<" "<<1<<" "<<1<<" "<<1<<endl;
            }       
            else{
                if(is_dec(str)) {
                    cout<<0<<" "<<0<<" "<<1<<" "<<1<<endl;
                }
                else{  
                    if(is_hex(str)) {
                        cout<<0<<" "<<0<<" "<<0<<" "<<1<<endl;
                    }
                    else{
                        cout<<0<<" "<<0<<" "<<0<<" "<<0<<endl;
                    }
                }
            }
        }
    }

综上,代码是这样的

#include <iostream>
#include <string>
using namespace std;
bool is_bin(string n){
    for(int i=0;i<n.length();i++){
        if(n[i]<'0' || n[i]>'1') return false;
    }
    return true;
}
bool is_oct(string n){
    for(int i=0;i<n.length();i++){
        if(n[i]<'0'|| n[i]>'7') return false;
    }
    return true;
}
bool is_dec(string n){
    for(int i=0;i<n.length();i++){
        if(n[i]<'0' || n[i]>'9') return false;
    }
    return true;
}
bool is_hex(string n){
    for(int i=0;i<n.length();i++){
        if(n[i]>'9' && n[i]<'A'|| n[i]<'0' || n[i]>'F') return false;
    }
    return true;
}
int main(){
    int k;
    cin>>k;
    for(int i=0;i<k;i++){
        string str;
        cin>>str;
        if(is_bin(str)) {
            cout<<1<<" "<<1<<" "<<1<<" "<<1<<endl;
        }
        else{
            if(is_oct(str)) {
                cout<<0<<" "<<1<<" "<<1<<" "<<1<<endl;
            }       
            else{
                if(is_dec(str)) {
                    cout<<0<<" "<<0<<" "<<1<<" "<<1<<endl;
                }
                else{  
                    if(is_hex(str)) {
                        cout<<0<<" "<<0<<" "<<0<<" "<<1<<endl;
                    }
                    else{
                        cout<<0<<" "<<0<<" "<<0<<" "<<0<<endl;
                    }
                }
            }
        }
    }
    return 0;
}

AC记录详情:记录详情 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

### GESP202309 四级考试进制转换编程题解析 对于GESP202309四级考试中的进制转换题目,主要考察的是考生对不同进制之间相互转换的理解以及实现这些转换的能力。具体来说,该类题目通常涉及将给定的不同进制数值(如二进制、八进制或其他任意基数)转换成十进制表示形式。 #### 题目概述 题目要求处理一系列由用户输入的数据组,每一组数据包含两个部分:首先是待转换数所在的原始进制\( K \),其次是按照此进制给出的具体数值字符串。程序的任务是对每一个这样的组合执行相应的计算操作,最终输出对应的十进制结果[^3]。 #### 实现思路 解决此类问题的关键在于理解如何通过数学运算完成从一种特定的计数体系到另一种的标准表达方式之间的映射关系。这里介绍了一种通用的方法来应对各种可能遇到的情况: 1. **初始化变量**:读取输入参数`N`作为后续循环次数的基础;准备用于存储中间结果的工作区。 2. **遍历所有条目**:针对每一对`(K, num)`进行如下步骤: - 将字符型的num逐位拆解为单独元素; - 对于每一位上的数字d及其位置i(从右向左编号), 计算其权重w=Ki; - 使用公式\[decimal += d * w\]累加得到总和即为目标十进制值。 3. **输出答案**:打印或返回经过上述过程获得的结果列表。 下面是一个Python版本的例子代码实现了这个逻辑: ```python def convert_to_decimal(base, number_str): decimal_value = 0 power = 0 for digit_char in reversed(number_str): # 反转字符串以便按权相乘 try: digit = int(digit_char) except ValueError: raise Exception(f"Invalid character '{digit_char}' found.") if not (0 <= digit < base): raise Exception( f"Digit {digit} is out of range for base-{base}." ) decimal_value += digit * (base ** power) power += 1 return decimal_value if __name__ == "__main__": n_cases = int(input().strip()) results = [] while n_cases > 0: k_base, raw_num = input().split() converted_result = convert_to_decimal(int(k_base), str(raw_num)) results.append(converted_result) n_cases -= 1 for res in results: print(res) ``` 这段脚本首先定义了一个辅助函数`convert_to_decimal()`用来做实际的进制转换工作,接着在外层控制结构里完成了整个流程的调度与管理。注意这里的异常处理机制可以有效防止非法输入造成程序崩溃。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值