之前问过杜老书上一个关于用递归实现的进制转换的问题,解决之后杜老告诉我可以推广到任何进制的转换,于是尝试了一下
---7.1-update-更新了进制转换公式中的一个错误---

代码如下

//教材《C语言程序设计》 第4单元编程题 用递归写一个 10-16进制转换程序
//错误 输入一个数后回车无反应 连续输入4个数后 结果为0 
int conv16(int x){

    if(x>=16){//这里是杜老提供的改进过答案(瞬间感觉教材上的答案like a shit -/滑稽) 
        conv16(x/16);
        conv16(x%16);
    }
    else{
        if(x>10)    //对字母的处理 
            printf("%c",x%16-10+'A');
        else
            printf("%c",x%16+'0');
    }
    
} 
int conv8(int x){//推广到8进制 
    
    if(x>=8){
        conv8(x/8);
        conv8(x%8);
    }else{
        printf("%c",x%8+'0');
    }
    
} 

int conv2(int x){//推广到2进制 
    
    if(x>=2){
        conv2(x/2);
        conv2(x%2);
    }else{
        printf("%c",x%2+'0');
    }
    
} 

int conv_n(int x, int n){//推广到n进制 
    
    if(x>=n){
        conv_n(x/n,n);
        conv_n(x%n,n);
    }else{
        printf("%c",x%n+'0');
    }
    
} 


int main(){
    int x = 120;
    int n = 3;
    
    conv16(x);printf("\n");
    conv8(x);printf("\n");
    conv2(x);printf("\n");
    conv_n(x,n);
    
    return 0;
}

这里使用了输入
x =

120

来进行验证

输出为

78
170
1111000
11110

检验后确实实现了对10-n进制的正确转换
//实现对x(待转换值),n(目标进制)的输入
于是想再改进一下代码,试着推广到n进制-m进制的转换

想了一下,直接实现应该比较困难,于是采用间接实现的方法
即编写一个n_DEC(任何进制转十进制)的函数,然后再用conv_n实现整个流程
这里就涉及到进制转换的原理

n进制数N的构成为.....edcba[从后往前算]
进制n->m

【M = en^4 + dn^3 + cn^2 + bn^1 + a*n^0】

(数N的第几位对应多少次方,从0开始算有点反人类对吧,但没办法这就是计算机思维)——《程序员教程-第二版》

那么来想一下n_DEC(任何进制转十进制)的函数应该如何实现

@#¥%……&根据上面那个公式还是没什么思路,于是老老实实手算模拟了一下进制转换的过程,发现就是一个N不断除以m然后逆向取余的过程

120 / 2 = 60 |余数 = 0
60 / 2 = 30 |余数 = 0
30 / 2 = 15 |余数 = 0
15 / 2 = 7 |余数 = 1
7 / 2 = 3 |余数 = 1
3 / 2 = 1 |余数 = 1
1 / 2 = 0 |余数 = 1 

/*逆向取得余数
于是 DEC-120->BIN = 1111000 */

这上面2是(待转换进制m,而(待转换数N在这里面是一个变量,随着被m除而不断变化,余数则是得出最终数关键值,需要单独记录|一般应该是用字符数组(而使用递归利用其特性省略了这一步)

发现这很符合递归的思想,于是这个递归实现进制转换的算法也就显得很自然而然了(nm原来这么简单TAT)

而这个算法里面N进制n默认的,无法改变(看来只能间接转换的方法咯)

由此还要再写一个n_DEC(任意进制->DEC)的函数

--WOC突然想起来16进制的问题,包含字符啊不能直接int传参进去,这个真要解决起来又好麻烦啊(死掉)---
---今晚先到这,明天再想了---

改进代码如下

标签: 算法

已有 3 条评论

  1. 疑问 疑问

    改进代码如下??怎么看不到改进代码??

    1. 不对···是后面···跳票了

    2. 写在注释里面了

添加新评论