C语言进制互相转换

题目要求,用户输入二进制、十进制、十六进制中的任意一种,程序输出另外两种结果
有三种格式

  1. 12345….纯数字,10进制
  2. 0x12345….,以0x/0X开头,16进制
  3. 1010….b,以b/B结尾,2进制
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
#include <stdio.h>
#include <string.h> //strlen函数需要

#define MaxChar 100 //最大字符

//平方运算
int PF(int k,int i){
int temp=1;
if (i==0)return 1;
while(i>0){
temp*=k;--i;
}
return temp;
}

//输入数据进制判断
int type_judge(char * str){
if ((str[strlen(str)-1]=='b')||(str[strlen(str)-1]=='B'))return 2;
else if (((str[0]=='0')&&(str[1]=='x'))||((str[0]=='0')&&(str[1]=='X')))return 16;
else return 10;
}

//二进制转整型
int b2D(char * str){
int temp=0;
for (int i = 0; i < strlen(str)-1; ++i) {
temp+=(str[i]-'0')*PF(2,strlen(str)-2-i);
}
return temp;
}

//十进制转整型
int d2D(char * str){
int temp=0;
for (int i = 0; i < strlen(str); ++i) {
temp+=(str[i]-'0')*PF(10,strlen(str)-1-i);
}
return temp;
}

//十六进制转整型
int x2D(char * str){
int temp=0;
for (int i = 2; i < strlen(str); ++i) {
if (str[i]<='9'&&str[i]>='0')temp+=(str[i]-'0')*PF(16,strlen(str)-1-i);
if (str[i]>='a'&&str[i]<='f')temp+=(str[i]-87)*PF(16,strlen(str)-1-i);
if (str[i]>='A'&&str[i]<='F')temp+=(str[i]-55)*PF(16,strlen(str)-1-i);
}
return temp;
}

//二进制格式输出
void binprintf(int data){
int i,k=0;
char bindata[MaxChar];
for(i=data;i>=2;){
bindata[k]=i%2+48;
i=(i-(i%2))/2;
k++;
if (i==1) {
bindata[k] = 49;
bindata[k+1] = '\0';
}
}
bindata[k+1] = '\0';
for (int j = 0; j < strlen(bindata); ++j) {
printf("%c",bindata[strlen(bindata)-1-j]);
}
printf("B");
}

void main() {
char userdata[MaxChar];
char bindata[MaxChar];
int inputtype;
int outputdata;
scanf("%s",userdata);
printf("您的输入是: ");
printf("%s\n",userdata);
printf("进制类型是: %d进制\n",type_judge(userdata));
printf("--------------------------------\n");
inputtype=type_judge(userdata);
if (inputtype==2){
outputdata=b2D(userdata);
printf("转化为十进制为: %d\n",outputdata);
printf("转化为十六进制为: 0x%x",outputdata);
}
if (inputtype==10){
outputdata=d2D(userdata);
printf("转化为十六进制为: 0x%x\n",outputdata);
printf("转化为二进制为: ");
binprintf(outputdata);
}
if (inputtype==16){
outputdata=x2D(userdata);
printf("转化为十进制为: %d\n",outputdata);
printf("转化为二进制为: ");
binprintf(outputdata);
}
}