在讨论之前,先看下面几个简单问题, 很简单的,就是几个除法,模除的表达式。
在程序中求.....
15 %4 = ?
15 %-4 = ?
-15 %4 = ?
-15% -4 =?
看看结果是多少呢?
回顾一下10进制转(m = 2,...16)进制的方法:
while(n)
{
取余数,如果余数大于9,则用字母表示;
n = n/m;
}
以上的做法对于m>0的都成立,也就是正权数。但是对于1295的负权数,按照原来的方法必然出现问题。
从简单开始分析: -15的-2进制表达式为110001:
-25000 -16 为 7FB8
因此,负进制同样保持着进位的规则,也就是每个表达式中的每位都是只有(0~|m|-1)中|m|个数字组成。
关键分析:
如果在while(n){}的循环中,某次取出的余数是负数,则需要转换为正数,
道理和模除有关,就像模除中 3%2 = 1, 3%2 = -1是一样的。因为不可能让一个表示
中出现负数,但是在计算机器中,求a%b的结果是正还是负数是由a的正负来决定的。
因此,关于负数的表达式算法应该为:
while(n)
{
x = n%m;
if(n>0||x == 0)
n = n/m;
else
{
n = n/m + 1;
x = x - m;
}
//记录x
}
***注意对0的特殊处理****
#include<string>
#include<iostream>
using namespace std;
int A[100];
char arr[16]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
void display()
{
int i=99;
while(A[i]==0) i--;
while(i>=0)
{
cout<<arr[A[i]];
i--;
}
cout<<endl;
}
int main()
{
int n,m,i,x;
while(cin>>n)
{
for(i=0;i<100;i++)
A[i]=0;
i=0;
cin>>m;
while(n)
{
x = n%m;
if(n>0||x == 0)
n = n/m;
else
{
n = n/m + 1;
x = x - m;
}
A[i++]=x;
}
display();
}
return 0;
}