平常我们所用的数字一般都是十进制,但是计算机使用的是二进制。另外还有八进制、十六进制等。那么如何将进制相互转化呢?
将一个P进制的数转化为Q进制的数,一般方法主要分为两步:
1、将P进制的数 x 转化为十进制的数 y
P进制数:
根据进制的定义,得:
十进制数:
代码如下:
/* 传入参数:P进制数x
* 返回:对应的十进制数 */
int f(int x, int p) {
int y = 0;
int product = 1;
while (x != 0) {
y += (x % 10) * product;
x = x / 10;
product *= p;
}
return y;
}
2、将十进制的数 y 转化为Q进制的数 z
采用除基取余法:将待转换数y不断除以 2,并保留余数作为低位储存,直到商为 0 停止。
如下图就是将十进制数 18转换为二进制数 10010的过程。
具体的代码实现:
🌂当数字范围不大时,可直接返回 int 型 :
/* 传入参数:十进制数y,待转换的进制q
* 返回:对应的q进制数 */
int g(int y, int q) {
int z = 0;
/* 当商为零的时候结束循环 */
while (y != 0) {
z = z * 10 + y % q;
y = y / q;
}
return z;
}
🌂当数字范围较大时,为了避免溢出,可将转换结果从低位到高位存在数组内:
int ans[100] = 0;
/* 传入参数:十进制数y,待转换的进制q
* 将结果 从低位到高位 存在数组内 */
int g(int y, int q) {
int count = 0;
do {
ans[count++] = y % q; //除基取余
y = y / q;
} while (y != 0); // 当商为零的时候结束循环
}
这种方法要注意:
1、在ans数组内,从下标count - 1到0排列,为准换结果。
2、要使用do while循环而不是while循环,考虑到传入y = 0时也要给ans[0]赋值0,否则容易出错。
end
欢迎关注个人公众号“ 鸡翅编程 ”,这里是认真且乖巧的码农一枚。
---- 做最乖巧的博客er,做最扎实的程序员 ----
旨在用心写好每一篇文章,平常会把笔记汇总成推送更新~