以前我们常做的进制转换题进制通常都是正整数,那么如果进制为负数该如何转换呢?
首先,来了解一下进制转换的本质,以十进制向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; }
标签:10,进制,负数,余数,被除数,除数 From: https://www.cnblogs.com/jwg2732/p/18544729