• 实现各种进制转换(c++版)


    前言

    我们最常见的进制转换就是十进制转换为二进制了,就是不停的作除法,取余数。

    例如:十进制的10转换为二进制

    10÷2=5···0

    5÷2=2···1

    2÷2=1···0

    1÷2=0···1

    直到商为0,然后把余数倒着写,所以10的二进制表示为1010。

    十进制->N进制

    会了十进制转换为二进制,那么十进制转换为任意进制也就迎刃而解了,只要不停的除法和取余就好了。

    #include <iostream>
    #include <cstdio>
    #include <stack>
    /*
     * 进制转换 10——>n(n<10)
     * */
    using namespace std;
    
    void ConvertT2N(int number,int n){
        stack<char> s;
        if (number == 0) {  //特殊情况,当输入是0时,输出也是0,否则输入0时就卡那了
            s.push(0);
        } else {
            while (number) {
                s.push(number % n);
                number /= n;
            }
        }
        // 把栈中的余数输出
        while (!s.empty()) {
            printf("%d", s.top());
            s.pop();
        }
        printf("\n");
    }
    int main(){
        int number;
        while (scanf("%d", &number) != EOF) {
            ConvertT2N(number, 2);
        }
        return 0;
    }
    

    但是上面的代码是有一点小问题的,它只能转换10以内的进制,也就是N必须小于10,否则就会出错。例如十进制转换成十六进制就会出错。例如11转换成十六进制表示为b而不是11,因为当表示十进制以上的数时需要用到字母a,b,c,d等等。

    所以需要在输出的余数上面加加工一下,把大于10的数用字母表示。

    改进版代码如下:

    #include <iostream>
    #include <cstdio>
    #include <stack>
    
    using namespace std;
    
    // 把整数转换成对应进制的字符,例如10的十六进制中表示为A
    char Int2Char(int target){
        if (target < 10) {
            return target + '0';
        } else {
            return target - 10 + 'A';
        }
    }
    /*
     * 现在N可以取任意进制了
     * */
    void ConvertT2N(int number,int n){
        stack<char> s;	//因为要存字母所以用char
        if (number == 0) {  //特殊情况,当输入是0时,输出也是0,否则输入0时就卡那了
            s.push(0);
        } else {
            while (number) {
                s.push(Int2Char(number % n));	//在余数入栈时加工一下,把int转换成char
                number /= n;
            }
        }
        // 把栈中的余数输出
        while (!s.empty()) {
            printf("%c", s.top());
            s.pop();
        }
        printf("\n");
    }
    int main(){
        int number;
        while (scanf("%d", &number) != EOF) {
            ConvertT2N(number, 16);//把十进制转换为十六进制
        }
        return 0;
    }
    

    N进制转换成十进制

    会了十进制转换为N进制,那么把N进制转换为十进制倒着来就好了,不停的乘N,加上余数。

    例如:二进制的1010转换为十进制

    0*2+1=1

    1*2+0=2

    2*2+1=5

    5*2+0=10

    #include<iostream>
    #include<cstdio>
    
    
    using namespace std;
    /*
     * 进制转换 N->10
     * */
    // 先把字母转换成数字
    int Char2Int(char target) {
        if (target >= '0' && target <= '9') {
            return target - '0';
        } else {
            return target - 'A' + 10;
        }
    }
    void ConverM2T(string str,int m){
        int number = 0; //该数在10进制下的表示
        for (int i = 0; i < str.size(); ++i) {
            number *= m;
            number += Char2Int(str[i]);
        }
        printf("%d\n", number);
    }
    
    int main(){
        string str;
        while (cin >> str) {
            ConverM2T(str,16);	//把十六进制转换为十进制
        }
        return 0;
    }
    

    M进制转换为N进制

    上述前两个都会了以后,实现把M进制转换成N进制了,思路是先把M进制转换成十进制,然后再把十进制的数转换成N进制。

    #include <iostream>
    #include <cstdio>
    #include <stack>
    #include <string>
    using namespace std;
    /*
     * M进制转换成N进制
     * */
    int Char2Int(char target) {
        if (target >= '0' && target <= '9') {
            return target - '0';
        } else {
            return target - 'A' + 10;
        }
    }
    // M进制转换成十进制的数返回
    int ConverM2T(string str,int m){
        int number = 0; //该数在10进制下的表示
        for (int i = 0; i < str.size(); ++i) {
            number *= m;
            number += Char2Int(str[i]);
        }
        return number;
    }
    
    char Int2Char(int target){
        if (target < 10) {
            return target + '0';
        } else {
            return target - 10 + 'a';
        }
    }
    //十进制转换成N进制
    void ConvertT2N(int number,int n){
        stack<char> s;
        while (number) {
            s.push(Int2Char(number % n));
            number /= n;
        }
        if (s.empty()) {    //当输入是0时,输出也是0
            printf("0");
        }
        while (!s.empty()) {
            printf("%c", s.top());
            s.pop();
        }
        printf("\n");
    }
    
    int main(){
        int m,n;
        while (scanf("%d%d",&m,&n)!=EOF){
            string str;
            cin >> str;
            int number = ConverM2T(str, m);// M进制转换成十进制的数返回
            // 再把该数转换成N进制
            ConvertT2N(number, n);
        }
        return  0;
    }
    
  • 相关阅读:
    jquery点击事件后增加克隆的标签,并改变克隆的属性加入
    jQuery 文本插入和标签移动方法
    用jquery来实现正反选选择框checkbox的小示例
    js 常用事件句柄总结
    jQuery 菜单小练习(实现点击和移动鼠标效果)
    jQuery 选择器
    js 中移动元素的方法
    《JavaScript总结》深拷贝和浅拷贝
    《JavaScript总结》js的运行机制
    git 撤回放到暂存区的文件
  • 原文地址:https://www.cnblogs.com/lxy0/p/16006162.html
Copyright © 2020-2023  润新知