十进制N和其他d进制之间进行转化是计算机实现计算的基本问题,其解决的方法有很多种,但是其中一种方法就是基于以下基本原理:N = (N / d) * d + N % d;
举个例子:(十进制数)1348 = (八进制数) 2504,其运算过程如下:
N N / 8 N % 8
1348 168 4
168 21 0
21 2 5
2 0 2
由上述运算过程可知,最后的结果为计算过程中得到的结果的逆序。既然是逆序,我们就可以通过栈这种先进后出的数据结构来实现,或者是通过递归的方式。下面就给出使用C语言实现的栈和递归的两种方式。
栈
创建一个栈,将每次取模的结果压栈,最后结束当被除数为0时再逐个出栈,即可得到结果。
注意点:在进行进制转化的时候由于要考虑可能存在的十进制转换为十六进制,而十六进制中存在A,B,C这类字符让得到的结果和数字不能统一起来,因此这里我使用的字符数组来保存数据,具体实现细节在代码中体现。
/**使用栈进行进制转化,N是非负十进制整数,B是要转化的进制数*/
void conversionBase(int N, int B) {
if(N == 0 || B < 0) {
return;
}
char stack[128]; //用数组来模拟栈
int top = 0;
if (B <= 10) { //比如二进制,八进制的做法
while (N) {
stack[top++] = (N % B) + '0'; //'0',可将int类型转化为字符类型
N /= B;
}
} else {
while (N) {
if (N % B > 9) {
stack[top++] = (N % B) - 10 + 'A'; //'A',可将int类型转换为字符类型
} else {
stack[top++] = (N % B) + '0';
}
N /= B;
}
}
//从栈顶开始逐个输出字符
for (int i = top - 1 ; i >= 0; i--) {
printf("%c",stack[i]);
}
}
递归
/**-- 使用递归的方式实现进制转化 --*/
void conversionRecu(int N, int B) {
if (N == 0 || B < 0) { //不符合的情况就直接退出,增加程序健壮性
return;
}
conversionRecu(N / B,B); //先递归调用,之后再进行输出
if (B <= 10) {
printf("%c",N % B + '0'); //'0',可将int类型数据转化为字符类型输出
}
if (B > 10) {
if (N % B > 9) {
printf("%c",N % B - 10 + 'A'); //'A',同上作用
} else {
printf("%c",N % B + '0');
}
}
}
下面是两种方法的测试结果:
输入:十进制数:N和要转换的进制:B
输出:转化为B进制的结果