CCF-GESP计算机学会等级考试2023年9月四级C++T1进制转换

3.1
编程题 1
试题编号 2023-09-23-04-C-01
试题名称 :进制转换
时间限制 1.0 s
内存限制 128.0 MB
3.1.1
问题描述
N进制数指的是逢 N进一的计数制。例如,人们日常生活中大多使用十进制计数,而计算机底层则一般使用二进 制。除此之外,八进制和十六进制在一些场合也是常用的计数制(十六进制中,一般使用字母 A F 表示十至十 五;本题中,十一进制到十五进制也是类似的)。
在本题中,我们将给出 个不同进制的数。你需要分别把它们转换成十进制数。
3.1.2
提示
对于任意一个L 位 K进制数,假设其最右边的数位为第0位,最左边的数位为第L-1位,我们只需要将其第i 位 的数码乘以权值K^i,再将每位的结果相加,即可得到原 K进制数对应的十进制数。下面是两个例子:
1. 八进制数 1362 对应的十进制数为1*8^3+3*8^2+6*8^1+2*8^0=754 ;
2. 十六进制数 3F0 对应的十进制数为3*16^2+15*16^1+0*16^0=1008 。
3.1.3
输入描述
输入的第一行为一个十进制表示的整数 N。接下来 N行,每行一个整数 K,随后是一个空格,紧接着是一个K 进 制数,表示需要转换的数。保证所有 进制数均由数字和大写字母组成,且不以 0 开头。保证K 进制数合法。
保证 N<=1000;保证22<=K<=16
保证所有 K进制数的位数不超过9 。
3.1.4
输出描述
输出N 行,每一个十进制数,表示对应K 进制数的十进制数值。
3.1.5
特别提醒
在常规程序中,输入、输出时提供提示是好习惯。但在本场考试中,由于系统限定,请不要在输入、输出中附带任 何提示信息。
3.1.6
样例输入 1
2
8 1362
16 3F0
3.1.7
样例输出 1
754
1008
3.1.8
样例输入 2
2
2 11011
10 123456789
3.1.9
样例输出 2
27
123456789
解析,对于一个K进制数abc,我们可以这样计算((a*K)+b)*K+c使用循环即可实现,详见代码:
#include <iostream>
using namespace std;
int n;
int main() {
    cin>>n;
    while(n--){
        int k;
        string s;
        cin>>k>>s;
        long long ans=0;
        for (int i=0;i<s.length();i++){
            if (s[i]>='0'&&s[i]<='9')
                ans=ans*k+s[i]-'0';
            else
                ans=ans*k+s[i]-'A'+10;
        }
        cout<<ans<<endl;
    }
    return 0;
}

另一种使用函数的解法:

#include <iostream>
#include <cstring>
using namespace std;
int trans_digit(int k, char c) {
    if (c <= '9')
        return (c - '0');
    return (c - 'A' + 10);
}
long long trans(int k, char str[]) {
    int l = strlen(str);
    long long res = 0, pw = 1;
    for (int i = l - 1; i >= 0; i--) {
        res += pw * trans_digit(k, str[i]);
        pw *= k;
    }
    return res;
}
int main() {
    int n = 0;
    cin >> n;
    for (int t = 0; t < n; t++) {
        int k = 0;
        char str[10];
        cin >> k >> str;
        cout << trans(k, str) << endl;
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

长春高老师编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值