雨打芭蕉叶

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

以前我们常做的进制转换题进制通常都是正整数,那么如果进制为负数该如何转换呢?

首先,来了解一下进制转换的本质,以十进制向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;
}

  

posted on 2024-11-13 20:32  雨打芭蕉叶  阅读(113)  评论(0)    收藏  举报