共计 1300 个字符,预计需要花费 4 分钟才能阅读完成。
进制转换的那些事儿
进制转换是一种较为特殊的数位拆解
以下解释部分来源:知乎网友进制这事儿,说到底就是位值原理,即:同一个数字,放在不同的数位上,代表不同大小的“量”。例如:十进制中,百位上的 1 表示 100,十位上的 1 表示 10。任何进制中,每个数都可以按位权展开成各个数位上的数字乘以对应数位的位权,再相加的形式,如:十进制的 123=1×100+2×10+3×1 十进制的 9876=9×1000+8×100+7×10+6×1 问:为啥相应的数位是 1000、100、10、1?为啥不是 4、3、2、1?答:十进制,满十进一,再满十再进一,因此要想进到第三位,得有 10×10;第 4 位得有 10×10×10 这样我们就知道了:对 10 进制,从低位到高位,依次要乘以 10^0,10^1,10^2,10^3……,也就是 1、10、100、1000 对 2 进制,从低位到高位,依次要乘以 2^0,2^1,2^2,2^3……,也就是 1、2、4、8……
总之,n 进制 k 转换成 m 进制 t,只需先将 n 进制 k 转换成十进制 q,再将十进制 q 转换成 m 进制 t
题目描述
求任意两个不同进制非负整数的转换(2 进制~16 进制),所给整数在 long 所能表达的范围之内。不同进制的表示符号为(0,1,…,9,a,b,…,f)或者(0,1,…,9,A,B,…,F)。
输入
输入只有一行,包含三个整数 a,n,b。a 表示其后的 n 是 a 进制整数,b 表示欲将 a 进制整数 n 转换成 b 进制整数。a,b 是十进制整数,2 =< a,b <= 16。
输出
可能有多组测试数据,对于每组数据,输出包含一行,该行有一个整数为转换后的 b 进制数。输出时字母符号全部用大写表示,即(0,1,…,9,A,B,…,F)。
样例输入
15 Aab3 7
样例输出
210306
代码块
int main() {
int a, b;
char n[40];
while (scanf(“%d%s%d”, &a, n, &b)!=EOF) {
int size1 = strlen(n);
int res=0;
for (int i = size1-1; i >= 0; i–)
{
int x;
if (n[i] >= ‘0’ && n[i] <= ‘9’) {
x = n[i] – ‘0’;
}
else if (n[i] >= ‘a’ &&n[i] <= ‘z’) {
x = n[i] – ‘a’+10;
}
else
{
x= n[i] – ‘A’ + 10;
}
res += x * pow(a, size1 – i – 1);
}
char ans[40];
int size = 0;
while (res != 0) {
int t = res%b;
if (t < 10) {
ans[size++] = t + ‘0’;
}
else {
ans[size++] = t – 10 + ‘A’;
}
res /= b;
}
for (int i = size-1; i>=0 ; i–)
{
printf(“%c”, ans[i]);
}
printf(“\n”);
}
return 0;
}
总结
1. 字符转换,根据 ACSII 码,进行数字与字符之间的转换。
if (n[i] >= ‘0’ && n[i] <= ‘9’) {
x = n[i] – ‘0’;
}
else if (n[i] >= ‘a’ &&n[i] <= ‘z’) {
x = n[i] – ‘a’+10;
}
else
{
x= n[i] – ‘A’ + 10;
}