进制转换

《程序员的数学思维修炼》一书中的进制转换方式,作为一个小技能积累下来。

前言

进制转换是我们经常需要做的工作,二进制和十六进制用于计算机表示,十进制常用于人类交流,人类熟悉十进制,因此如果要将一个进制数转换为另一个进制数,可以使用十进制进行中间转换,下面归纳B进制与十进制之间的转换方式:
一个B进制的数要转换为十进制乘权展开;
一个十进制的数要转换为B进制使用除模取余法进行;

算法

我们考虑接受输入为一个字符数组input,原进制jz1,目标进制jz2。转换算法如下:
(1)采用乘权展开转换为十进制;
(2)将这个十进制不断的除模取余,使用char数组output来存放这样的输出;
转换算法很简单,注意输入输出即可:

实现

#include<stdio.h>
#include<string.h>
#include<conio.h>

//求x的y次方幂
int int_pow(int x,int y){
    int i,result=1;
    for(i=1;i<=y;i++){
        result*=x;
    }
    return result;
}

//将十进制数转换为任意进制,参数dnum为十进制数,参数jz为目标进制
void dtox(int dnum,int jz){
    char xnum[100];      
    //保存目标进制的数组,注意这个数组是存放目标进制的ASCII码
    int i=0,j=0;
//只要这个十进制数比进制大,那么就一直除模取余法
        if(dnum%jz<=9)  
        //10以上的数字就要使用字母,这里做个判别
            xnum[j++]=dnum%jz+'0';
        else
            xnum[j++]=dnum%jz-10+'A';
        dnum=dnum/jz;
    }
    if(dnum<=9)     //除完了之后也需要做一个判别
        xnum[j]=dnum+'0';
    else
        xnum[j]=dnum-10+'A';
    for(i=j;i>=0;i--){
        printf("%c",xnum[i]);
    }
}
/*将输入的数转换为十进制,参数num是一个数组,保存输入的字符串,桉树jz源数据的进制*/
int xtod(char num[],int jz){
    int dnum=0,i,n=0,b;
    //统计字符的长度
    for(i=0;;i++){
        if(num[i]=='\0')
            break;
        else
            n++;
    }
    for(i=n-1;i>=0;i--){
        if(num[n-i-1]>='a')     //先转换
            b=num[n-i-1]-'a'+10;
        else if(num[n-i-1]>='A')
            b=num[n-i-1]-'A'+10;
        else
            b=num[n-i-1]-'0';
        dnum=dnum+b*int_pow(jz,i);  //然后乘权求和
    }
    return dnum;
}

int main(){
    char num[100];
    int jz1,jz2;
    printf("输入将要转换的数:");
    scanf("%s",num);
    printf("输入数的进制:");
    scanf("%d",&jz1);
    printf("要转换的进制:");
    scanf("%d",&jz2);
    dtox(xtod(num,jz1),jz2);
    getch();
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值