负数进制和正数进制类似。对于负数进制,每次取的余数保证在0~-m-1之间。(例如m=-16,则余数应该在0~15)就可以直接输出。 所以用系统的“mod”运算符的时候必须注意检查是不是在该范围(可能在m+1~0),否则就调整。调整的方法是:
if 余数<0 then
begin
余数=余数-m;
商=商+1;
end;
#include <iostream>
#include <cstdio>
using namespace std;
const int maxn = 1000;
int bit[maxn];
int main()
{
int n;
while(cin >> n)
{
int len = 0;
while(n)
{
int r = n % -2;
int c = n / -2;
if(r < 0)
{
c++;
r += 2;
}
n = c;
bit[len++] = r;
}
for(int i = len-1; i >= 0; i--)
{
printf("%d",bit[i]);
}
if(len == 0)
printf("0");
}
return 0;
}
说一点负数取余的知识
取余的函数定义 a%b = a - (a/b)*b
所以例如-7%5 = -7 - (-1)*5 = -2
比如:
21 % 6 = 3;21 % 7 = 0;
-21 % -8 = -5;
21 % -5 = 1;
21 / 6 = 3;
21 / 7 = 3;
-21 / -8 = 2;
21 / -5 = -4
余数符号与被除数符号一致