C++实现任意进制之间转换 | Hlwdy's blog
C++实现任意进制之间转换
发表于 2020-07-05 共 885 字
分类于 C++

实现思路

实现任意进制之间转换,这里的思路是先将这个数转换成十进制,再由十进制转换成其它进制。

实现任意进制到十进制的转换,采用的方法是:按位权展开相加。

例如,把二进制数1011按权展开:

$$1001=1×2^3+0×2^2+0×2^1+1×2^0=1×8+0×4+0×2+1×1=8+1=9$$

而将十进制转换成其它进制采用的方法是:乘基取整法。

举个例子,将十进制数7转换成二进制数,我们需要把7不断除以2,得到商和余数,将商继续除以2,直到商为0。最后将所有余数倒序排列,得到数就是转换结果。

具体过程:

$7÷2=3$余1

$3÷2=1$余1

$1÷2=0$ (0.5这里取0,余数就取被除数1)

将所有余数倒序排列,即为111

实现方法

首先,我们需要储存输入的数,这里需要注意的是,进制数大于10的数可能存在字母,例如:

十六进制是由 0~F 这一组固定的数字来表示,因此我们应该釆用字符数组进行储存输入的数。

然后在程序中我们用两个自定义函数char_to_numbernumber_to_char来实现一个字符与其对应数值之间的转换。

int char_to_num(char ch){
    if(ch>='0'&&ch<='9')
        return ch-'0';
    else
        return ch-'A'+10;
}
char num_to_char(int num){
    if(num>=0&&num<=9)
        return (char)('0'+num-0);
    else
        return (char)('A'+num-10);
}

任意进制到十进制的转换的实现如下,source为原数进制:

long long source_to_decimal(char* temp, int source){
    long long decimal_num=0;
    int length=strlen(temp);
    for(int i=0; i<=length-1; i++ )
        decimal_num = (decimal_num*source) + char_to_num(temp[i]);
    return decimal_num;
}

然后是十进制到任意进制(这个函数是返回得到结果的长度,因此用int就够了),object为转换后的进制:

int decimal_to_object(char* temp, long long decimal_num, int object){
    int i=0;
    while(decimal_num){
        temp[i] = num_to_char(decimal_num % object);
        decimal_num = decimal_num / object;
        i++;
    }
    return i;
}

完整程序代码如下:

#include<bits/stdc++.h>
const int Maxn=1001;//最大数组长度
int char_to_num(char ch){
    if(ch>='0'&&ch<='9')
        return ch-'0';
    else
        return ch-'A'+10;
}
char num_to_char(int num){
    if(num>=0&&num<=9)
        return (char)('0'+num-0);
    else
        return (char)('A'+num-10);
}
long long source_to_decimal(char* temp, int source){
    long long decimal_num = 0;
    int length=strlen(temp);
    for(int i=0; i<=length-1; i++ )
        decimal_num = (decimal_num*source) + char_to_num(temp[i]);
    return decimal_num;
}
int decimal_to_object(char* temp, long long decimal_num, int object){
    int i=0;
    while(decimal_num){
        temp[i] = num_to_char(decimal_num % object);
        decimal_num = decimal_num / object;
        i++;
    }
    return i;
}
int main(){
    int source,object;
    long long decimal_num;
    char temp[Maxn];//字符数组储存 
    printf("原数:");
    scanf("%s", temp);
    printf("原数的进制:");
    scanf("%d", &source);
    printf("目标数制:");
    scanf("%d", &object);
    printf("转换后的数:");
    decimal_num = source_to_decimal(temp, source);//转十进制 
    int length = decimal_to_object(temp, decimal_num, object);//转目标进制,并获取余数的数量
    for(int i=length-1; i>=0; i--)
        printf("%c", temp[i]);//逆序输出 
    return 0;
}

这个程序实现了输入原数、其进制和目标进制,输出转换结果。

测试结果如下,与上述结果一致:

原数:7
原数的进制:10
目标数制:2
转换后的数:111

值得注意的是,这只是实现了整数的进制转换,如果有负数或小数转换过程会更加复杂。

具体过程可以自行查阅资料。

筛选文章
类别选择 (分类/标签)
全屏 关闭