进制转化
之前学进制转化只是学个方法,也没去探究原理,借这道题先来整理一下,原理
如
14
(
b
a
s
e
10
)
14(base10)
14(base10)转换为二进制,
14
/
2
=
7
⋯
0
14/2=7\cdots0
14/2=7⋯0
7
/
2
=
3
⋯
1
7/2=3\cdots1
7/2=3⋯1
3
/
2
=
1
⋯
1
3/2=1\cdots1
3/2=1⋯1
1
/
2
=
0
⋯
1
1/2=0\cdots1
1/2=0⋯1
所以
14
(
b
a
s
e
10
)
=
1110
(
b
a
s
e
2
)
14(base10)=1110(base2)
14(base10)=1110(base2),如果除以base有余数就表示,这个位置在这个数的表示占有比重,如
16
(
b
a
s
e
10
)
=
10000
(
b
a
s
e
2
)
16(base10)=10000(base2)
16(base10)=10000(base2),因为
16
=
2
4
16=2^4
16=24,所以其他位置都没有比重。
再看一下负进制,原理与正进制差不多,都是除以base,但是会出现余数为负数的情况,这种情况肯定是不行的,于是找到如下公式
被
除
数
=
商
∗
除
数
+
余
数
=
余
数
−
除
数
−
(
商
+
1
)
∗
除
数
被除数=商*除数+余数=余数-除数-(商+1)*除数
被除数=商∗除数+余数=余数−除数−(商+1)∗除数,
这样就能把负的余数化为正的了,代码如下
#include<iostream>
#include<cstdio>
using namespace std;
char trans(int);
int main()
{
int n,base,t,num=0;
cin>>n>>base;
cout<<n<<'=';
int arr[10];
while(n)
{
arr[num]=n%base;
n/=base;
if(arr[num]<0)
{
arr[num]-=base;
n++;
}
num++;
}
for(t=num-1;t>=0;t--)
{
cout<<trans(arr[t]);
}
printf("(base%d)",base);
}
char trans(int number)
{
if(number<10&&number>=0)
return number+'0';
else return number-9+64;
}