问题描述
用户输入三个字符,每个字符取值范围是0-9,A-F。然后程序会把这三个字符转化为相应的十六进制整数,并分别以十六进制,十进制,八进制输出,十六进制表示成3位,八进制表示成4位,若不够前面补0。(不考虑输入不合法的情况)
输入格式
1D5
输出格式
(注意冒号后面有一个空格)
Hex: 0x1D5
Decimal: 469
Octal: 0725
解题思路
由于输入的字符串为十六进制数,因此先将十六进制数转换成二进制,在通过二进制数向八进制与十进制进行转换。
十六进制转二进制:每一位十六进制数对应四位二进制数,通过除余2,再除以2,从右往左得到四位二进制数,存入two数组
二进制转八进制:从右往左算,每三位二进制数对应一位八进制数,。设二进制数为100,对应的八进制数为 22*1+21*0+20*0
二进制转十进制:从右往左算,依次乘以2的n次方(n=0,1,2,3……)。设二进制数为abcde,对应的十进制数为 a* 24+b* 23+c* 22+d* 21+e* 20
代码如下:
#include<stdio.h>
#include<math.h>
void SixTwo(char st,int *arr,int k){//将十六进制数转换成二进制数
int temp[4],num;
if(st<58)
num=st-48;
else
num=10+st-65;
for(int i=3;i>=0;i--){
temp[i]=num%2;
num/=2;
}
for(int i=0;i<4;i++)
arr[i+4*k]=temp[i];
}
void TwoTen(int two[],int *ten){//将二进制数转换成十进制数
for(int i=11;i>=0;i--){
*ten+=pow(2,11-i)*two[i];
}
}
void TwoSeven(int two[],int *seven){//将二进制数转换成八进制数
int k=0,sum;
for(int i=0;i<12;i+=3){
sum=0;
for(int j=i;j<i+3;j++){
sum+=pow(2,i+2-j)*two[j];
}
seven[k++]=sum;
}
}
int main(){
char str[3];
int two[12],ten=0,seven[4];
gets (str);
for(int i=0;i<3;i++){
SixTwo(str[i],two,i);
}
TwoTen(two,&ten);
TwoSeven(two,seven);
printf("Hex: 0x%s\n",str);
printf("Decimal: %d\nOctal: ",ten);
for(int i=0;i<4;i++)
printf("%d",seven[i]);
return 0;
}