以前我们常做的进制转换题进制通常都是正整数,那么如果进制为负数该如何转换呢?
首先,来了解一下进制转换的本质,以十进制向r进制转换为例:
例:(123)10如何转换成r进制的数?
采用的方法为除r取余法:假如r为2
除数 被除数 余数
2 | 123
2 | 61 1
2 | 30 1
2 | 15 0
2 | 7 1
2 | 3 1
2 | 1 1
2 | 0 1
即(123)10=(1111011)2
那么如果进制为负数该如何处理呢?方法同上,以(-15)10转换为-2进制为例:
除数 被除数 余数
-2 | -15
-2 | 7 -1 //此处余数为-1,显然不可以,余数只能是正数,该如何处理才能使//得余数为正呢?方法是商+1,余数为余数-除数,所以更新为右边所//示
-2 | 8 1
-2 | -4 0
-2 | 2 0
-2 | -1 0
-2 | 0 -1 //此时余数又为负数,处理方法同上
-2 | 1 1
-2 | 0 1
即(-15)10=(110001)-2
总结:十进制数转换为负进制的方法依然是除r取余法,只是在遇到余数为负数的情况下,需做下面两个处理:
1、商+1
2、余数-除数
证明如下:
对于任何进制而言,都有:被除数=商*除数+余数,
当我们把商+1,用余数-除数(余数的绝对值一定小于除数),就能把余数由负数转换成正数。
(商+1)*除数+(余数-除数)=商*除数+除数+余数-除数=商*除数+余数=被除数
参考代码如下:
#include<bits/stdc++.h>
using namespace std;
int a[50];
int main()
{
int n, r, k = 0;
cin >> n >> r;
cout << n << "=";
if(n == 0) cout << 0;
else
{
while (n)
{
a[++k] = n % r;
n /= r;
if (a[k] < 0) a[k] -= r, n++;//商+1,余数-除数
}
for (int i = k; i >= 1; i--)
{
if (a[i] < 10) cout << a[i];
else cout << char(a[i] - 10 + 'A');
}
}
return 0;
}
浙公网安备 33010602011771号