不同进制的转换都可以通过转换为10进制再由10进制转为其他进制的方法来实现,首先我们先看看不同的进制转为10进制如何操作
举一个16进制转为10进制的例子,首先有数
1
F
3
E
1F3E
1F3E,将他转为10进制我们可以先把
1
F
3
E
1F3E
1F3E分解来看
1
F
3
E
=
1
⋅
1
6
3
+
F
⋅
1
6
2
+
3
⋅
16
+
E
1F3E=1\cdot 16^{3}+F\cdot 16^{2}+3\cdot 16+E
1F3E=1⋅163+F⋅162+3⋅16+E
也就是说
1
1
1乘以
16
16
16了
3
3
3次,
F
F
F乘以
16
16
16了
2
2
2次,
3
3
3乘以
16
16
16了
1
1
1次,
E
E
E乘以
16
16
16了
0
0
0次。
根据乘法的分配律,上述式子我们可以化为
(
(
(
1
⋅
16
+
F
)
⋅
16
+
3
)
⋅
16
+
E
)
(((1\cdot16+F)\cdot16+3)\cdot16+E)
(((1⋅16+F)⋅16+3)⋅16+E)
所以可以在该数的长度的复杂下完成进制转换
char a[]="1F3E";
int len=strlen(a);
int sum=0;
for(int i=0;i<len;i++)
{
sum=sum*16;
if(a[i]<='9'&&a[i]>='0')
sum+=a[i]-'0';
else
sum+=a[i]-'A'+10;
}
那么10进制如何转化为其他进制下的数呢
同样的我们拿一个数举例子如:
7998
7998
7998
我们用的是余数法,对于一个10进制数我们对其不断的做除法,每次所留下的余数就是就是要转化的数的低位
7998
/
16
=
499.......14
→
E
7998/16=499.......14\rightarrow E
7998/16=499.......14→E
499
/
16
=
31.......3
499/16=31.......3
499/16=31.......3
31
/
16
=
1.......15
→
F
31/16=1.......15\rightarrow F
31/16=1.......15→F
1
/
16
=
0.......1
1/16=0.......1
1/16=0.......1
所以从下往上看我们就可以得到我们要的16进制数
1
F
3
F
1F3F
1F3F
已知一个10进制数我们可以用栈来存我们每次的到的余数,最后再一次弹栈就是10进制要转化为其他的进制数了
stack<int> s;
int num=7998;
while(num)
{
s.push(num%16);
num/=16;
}
while(!s.empty())
{
if(s.top()<10)
printf("%d",s.top());
else
printf("%c",s.top()-10+'A');
s.pop();
}
不同进制的转换都可以用10进制为媒介然后先转换为10进制再从10进制转为其他进制