《程序员的数学思维修炼》一书中的进制转换方式,作为一个小技能积累下来。
前言
进制转换是我们经常需要做的工作,二进制和十六进制用于计算机表示,十进制常用于人类交流,人类熟悉十进制,因此如果要将一个进制数转换为另一个进制数,可以使用十进制进行中间转换,下面归纳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;
}