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
28 136216 3F0
3.1.7
样例输出
1
7541008
3.1.8
样例输入
2
22 1101110 123456789
3.1.9
样例输出
2
27123456789
解析,对于一个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;
}