进制转换的那些事儿
进制转换是一种较为特殊的数位拆解
以下解释部分来源:知乎网友
进制这事儿,说到底就是位值原理,即:同一个数字,放在不同的数位上,代表不同大小的“量”。例如:十进制中,百位上的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; }