您的位置:首页 > 其它

进制转换

2018-03-21 12:44 225 查看
一、十进制==>二、八、十六 进制  ==> 十进制#include<stdio.h>
#include<math.h>
void boh(float dec,int radix,char *sBoh);
float decimal(char *sBoh,int radix);
int main(){
float fDec;
int radix;
char sBoh[41];

printf("\n Enter a value to convert:");
scanf("%f",&fDec);

boh(fDec, 2, sBoh);
printf("from decimal to binary: %s\n",sBoh);

boh(fDec,8,sBoh);
printf("from decimal to octal: %s\n",sBoh);

boh(fDec,16,sBoh);
printf("from decimal to Hexadecimal: %s\n",sBoh);

printf("\n\nenter a binary string:");
scanf("%s",sBoh);
fDec = decimal(sBoh,8);
printf("from binary to Decimal: %f",fDec);

printf("\n\nenter a octal string:");
scanf("%s",sBoh);
fDec = decimal(sBoh,8);
printf("from Octal to Decimal: %f",fDec);

printf("\n\nenter a hexadecimal string:");
scanf("%s",sBoh);
fDec = decimal(sBoh,8);
printf("from hexadecimal to Decimal: %f",fDec);

}

float decimal(char *sBoh,int radix){
int i, iLen, iDec, digit;
char c,ch;
int fInt;
float fDec;

// 计算串长
i = 0;
iDec = -1;
while(sBoh[i]!='\0'){
//确定小数点在串中的位置
if(sBoh[i]=='.'){
iDec = i;
}
i++;
}
iLen = i;
if(iDec==-1) iDec = iLen-1;

//根据基数值radix 将串转换为数值
//析取各位数字
fInt = 0;
fDec = 0;
for(i=0;i<iLen;i++){
/*整数部分的数字按顺序方式加括号与乘2,小数部分的数字按逆序加括号与除2*/
if(i>iDec){
ch = sBoh[iDec+iLen-i];
}else{
ch = sBoh[i];
}

switch(ch){
case '0': digit = 0; break;
case '1': digit = 1; break;
case '2': digit = 2; break;
case '3': digit = 3; break;
case '4': digit = 4; break;
case '5': digit = 5; break;
case '6': digit = 6; break;
case '7': digit = 7; break;
case '8': digit = 8; break;
case '9': digit = 9; break;
case 'A': digit = 10; break;
case 'B': digit = 11; break;
case 'C': digit = 12; break;
case 'D': digit = 13; break;
case 'E': digit = 14; break;
case 'F': digit = 15; break;
default: digit = 0; break;
}
//乘2 或 1/2
if(i<iDec-1){
fInt = (fInt+digit)*radix;
}else if(i>iDec){
fDec = (fDec+digit)/radix;
}else if(i==iDec-1){
fInt = fInt+digit;
}else{
;
}
}

fDec = fDec + fInt;
return fDec;
}

void boh(float dec,int radix, char *sBoh){
int i,iInt,digit,iDec;
float fDec;
char sBohi[20],sBohd[20],ch;
//以小数点为界分成两部分
iInt = (int)dec;
fDec = dec-iInt;

//整数部分
i = 0;
do{
digit = iInt%radix;
iInt = iInt/radix;

if(digit<10){
// '0' ~ '9'
ch = 48 + digit;
}else{
// 'A' ~ 'F'
ch = 55 + digit;
}

sBohi[i] = ch;
i++;
} while(iInt>0);
iInt = i;

// 小数部分
i = 0;
do{
fDec = fDec*radix;
digit = (int)fDec;
fDec = fDec-digit;

if(digit<10){
// '0' ~ '9'
ch = 48 + digit;
}else{
// 'A' ~ 'F'
ch = 55 + digit;
}
sBohd[i] = ch;
i++;
} while(fDec>0);
iDec = i;

// 合并子串
for(i=0;i<iInt;i++){
//反向排列字符
sBoh[i] = sBohi[iInt-i-1];
}
sBoh[iInt] = '.';
for(i=0;i<iDec;i++){
sBoh[i+iInt+1] = sBohd[i];
}
sBoh[i+iInt+1] = '\0';
}二、使以上程序可以转换负数
三、实现 二、八、十六 进制数间的相互转换
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: