zoukankan      html  css  js  c++  java
  • [C/C++]16以内的任意进制相互转换

    背景

    正做到[PAT B1022]进制转换的问题,在完成题目的基础上,由于懒惰这一进步动力的驱使,我干脆有了把进制转换写成函数的想法……
    由于我们日常使用的都是十进制数,而计算机使用二进制(进而有了八进制和十六进制,当然,其原理一样),在此不妨以十进制为接口,充当目的进制和源进制作为中转实现任意进制的互转。
    实际用到的进制最高为16,所以下面的代码中限制进制为2到16(1进制显然没有意义),各数位上的代号有0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F。当然,如果将键盘上的数字与全部字母结合起来,可以达到36进制(忽略大小写的区别),或62进制(不忽略大小写,但这么大的进制数有什么意义……),故,仍将进制基数大小限制在2到16范围内(而其中常用的其实也就只有上面说到的十进制、二进制和十六进制)。

    十进制转N进制

    代码

    #include <cstdio>
    #include <cstring>
    using namespace std;
    
    char* dec2nbase(int decint, int base, char* coes) {
        if(decint>=0) {
            if(1<base && base<=16){
                int i = 0, temp[33] = {0};
                do {
                    temp[i++] += decint%base;
                    decint /= base;
                } while(decint != 0);
                for(int j = 0; j <= i-1; j++) {
                    if(temp[i-1-j] < 10)
                        coes[j] = '0'+temp[i-1-j];
                    else
                        coes[j] = 'A'+temp[i-1-j]-10;
                }
                return coes;
            }
            else
                return NULL;
        } else
            return NULL;
    }
    
    int main() {
        printf("Input: decimal integer D and base N(1<N<=16)\n");
        int D, N;
        char coes[33];
        while(scanf("%d%d", &D,&N) != EOF) {
            memset(coes, 0, sizeof(coes));  //need "string.h"
            char* nbasenum = dec2nbase(D, N, coes);
            printf("Convert to %d-base integer: %s\n", N, nbasenum);
        }
        return 0;
    }
    
    

    实验

    N进制转十进制

    代码

    #include <cstdio>
    #include <cmath>
    #include <cstring>
    using namespace std;
    
    int nbase2dec(int base, char* coes) {
        if(1<base && base<=16){
            int coe, res = 0;
            int len = strlen(coes);                     //need "string.h"
            for(int i = len-1; i >= 0; i--) {           //从最低位算起
                if('0'<=coes[i] && coes[i]<='9')
                    coe = coes[i]-'0';
                else if('A'<=coes[i] && coes[i]<='F')
                    coe = coes[i]-'A' + 10;
                else {
                    printf("Number illegal!\n");
                    return -1;
                }
                if(coe < base)
                    res += coe * pow(base, len-1-i);    //need "math.h"
                else
                    return -1;
            }
            return res;
        } else
            return -1;
    }
    
    int main() {
        printf("Input: base N(0<N<=16) and positive N-based integer C\n");
        char coes[32];
        int base, decnum;
        while(scanf("%d%s", &base, coes) != EOF) {
            decnum = nbase2dec(base, coes);
            printf("Convert to decimal integer: %d\n", decnum);
        }
        return 0;
    }
    
    

    实验

  • 相关阅读:
    Nginx开发从入门到精通
    Nginx配置文件(nginx.conf)配置详解
    转贝叶斯推断及其互联网应用(一):定理简介
    Vim 使用入门快捷键
    从贝叶斯定理说开去
    转特征值和特征向量
    第四章 特征值与特征向量
    numpy基础入门
    python range函数与numpy arange函数
    转悠望南山 Python闲谈(二)聊聊最小二乘法以及leastsq函数
  • 原文地址:https://www.cnblogs.com/4thirteen2one/p/9326864.html
Copyright © 2011-2022 走看看