0%

c-进制转换

进制转换

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
#include<iostream>
#include<algorithm>
#include<cmath>
#define Max 100000
#define R 16
#define Q 8
#include<string.h>
using namespace std;
char T[Max],G[Max];
int main()
{
int n;
cin>>n;
while(n--)
{
long long m=1,temp=0;
cin>>T;
//转化R为10进制
while(T[m]) { m++;} //判断T的长度
for(int i=0;i<m;i++)
{
if(T[i]>='0'&&T[i]<='9')
{
temp=temp+(T[i]-'0')*pow(R,m-1-i);
}
else
{
temp=temp+(T[i]-'A'+10)*pow(R,m-i-1);
}
}
//转化10为Q进制
int i=0; m=1;
while(temp)
{
G[i]=fmod(temp,Q)+'0';
temp=temp/Q;
i++;
}
while(G[m]) { m++;} //判断T的长度
int j=m-1;
for(int i=0;i<m/2;i++)
{
swap(G[i],G[j]);
j--;
}
cout<<G;
}

return 0;
}

不建议用来16进制转8进制,因数据过大,该算法有一定的缺陷。

利用二进制转换

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
#include<iostream>
#include<string.h>
#include<cmath>
#include<algorithm>
#include<stdio.h>
#define Max 100000
using namespace std;
char T[10][Max],G[10][Max],W[10][Max];
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++)
cin>>T[i];
for(int i=0;i<n;i++)
{
int m=1;
while(T[i][m]) {m++;}
//将T转化为2进制
switch(T[i][0])
{
case '1': G[i][0]='1'; break;
case '2': G[i][0]='1'; G[i][1]='0';break;
case '3': G[i][0]='1'; G[i][1]='1';break;
case '4': G[i][0]='1'; G[i][1]='0'; G[i][2]='0';break;
case '5': G[i][0]='1'; G[i][1]='0'; G[i][2]='1';break;
case '6': G[i][0]='1'; G[i][1]='1'; G[i][2]='0';break;
case '7': G[i][0]='1'; G[i][1]='1'; G[i][2]='1';break;
case '8': G[i][0]='1'; G[i][1]='0'; G[i][2]='0'; G[i][3]='0';break;
case '9': G[i][0]='1'; G[i][1]='0'; G[i][2]='0'; G[i][3]='1';break;
case 'A': G[i][0]='1'; G[i][1]='0'; G[i][2]='1'; G[i][3]='0';break;
case 'B': G[i][0]='1'; G[i][1]='0'; G[i][2]='1'; G[i][3]='1';break;
case 'C': G[i][0]='1'; G[i][1]='1'; G[i][2]='0'; G[i][3]='0';break;
case 'D': G[i][0]='1'; G[i][1]='1'; G[i][2]='0'; G[i][3]='1';break;
case 'E': G[i][0]='1'; G[i][1]='1'; G[i][2]='1'; G[i][3]='0';break;
case 'F': G[i][0]='1'; G[i][1]='1'; G[i][2]='1'; G[i][3]='1';break;
default:cout<<"有非16进制字符出现";break;
}
int n=1;
while(G[i][n]) {n++;}
for(int k=1;k<m;k++)
{
int j;
j=k;
switch(T[i][k])
{
case '0': G[i][4*j-4+n]='0'; G[i][4*j-3+n]='0'; G[i][4*j-2+n]='0'; G[i][4*j-1+n]='0';break;
case '1': G[i][4*j-4+n]='0'; G[i][4*j-3+n]='0'; G[i][4*j-2+n]='0'; G[i][4*j-1+n]='1';break;
case '2': G[i][4*j-4+n]='0'; G[i][4*j-3+n]='0'; G[i][4*j-2+n]='1'; G[i][4*j-1+n]='0';break;
case '3': G[i][4*j-4+n]='0'; G[i][4*j-3+n]='0'; G[i][4*j-2+n]='1'; G[i][4*j-1+n]='1';break;
case '4': G[i][4*j-4+n]='0'; G[i][4*j-3+n]='1'; G[i][4*j-2+n]='0'; G[i][4*j-1+n]='0';break;
case '5': G[i][4*j-4+n]='0'; G[i][4*j-3+n]='1'; G[i][4*j-2+n]='0'; G[i][4*j-1+n]='1';break;
case '6': G[i][4*j-4+n]='0'; G[i][4*j-3+n]='1'; G[i][4*j-2+n]='1'; G[i][4*j-1+n]='0';break;
case '7': G[i][4*j-4+n]='0'; G[i][4*j-3+n]='1'; G[i][4*j-2+n]='1'; G[i][4*j-1+n]='1';break;
case '8': G[i][4*j-4+n]='1'; G[i][4*j-3+n]='0'; G[i][4*j-2+n]='0'; G[i][4*j-1+n]='0';break;
case '9': G[i][4*j-4+n]='1'; G[i][4*j-3+n]='0'; G[i][4*j-2+n]='0'; G[i][4*j-1+n]='1';break;
case 'A': G[i][4*j-4+n]='1'; G[i][4*j-3+n]='0'; G[i][4*j-2+n]='1'; G[i][4*j-1+n]='0';break;
case 'B': G[i][4*j-4+n]='1'; G[i][4*j-3+n]='0'; G[i][4*j-2+n]='1'; G[i][4*j-1+n]='1';break;
case 'C': G[i][4*j-4+n]='1'; G[i][4*j-3+n]='1'; G[i][4*j-2+n]='0'; G[i][4*j-1+n]='0';break;
case 'D': G[i][4*j-4+n]='1'; G[i][4*j-3+n]='1'; G[i][4*j-2+n]='0'; G[i][4*j-1+n]='1';break;
case 'E': G[i][4*j-4+n]='1'; G[i][4*j-3+n]='1'; G[i][4*j-2+n]='1'; G[i][4*j-1+n]='0';break;
case 'F': G[i][4*j-4+n]='1'; G[i][4*j-3+n]='1'; G[i][4*j-2+n]='1'; G[i][4*j-1+n]='1';break;
default:cout<<"有非16进制字符出现";break;
}
}
int temp=0;
m=1;
while(G[i][m]) {m++;}
if(m%3==1) {W[i][0]='1'; temp++;}
if(m%3==2) {W[i][0]=(G[i][0]-'0')*2+(G[i][1]-'0')+'0'; temp++;}
for(int k=m%3;k<m;k=k+3)
W[i][temp++]=(G[i][k]-'0')*4+(G[i][k+1]-'0')*2+(G[i][k+2]-'0')+'0';
if(i==n-2)
cout<<W[i];
else
cout<<W[i]<<endl;
}
return 0;
}

进制转换时忽略前导0

1
2
3
4
5
6
7
8
9
10
int flag=0;
for(int i=0;i<=s2.length()-3;i+=3)
{
int num=4*(s2[i]-'0')+2*(s2[i+1]-'0')+(s2[i+2]-'0');
if(num)
flag=1;//忽略前导0
if(flag)
cout<<num;
}
cout<<endl;