POJ-3191(负进制)

来源:互联网 发布:mac远程桌面win10 编辑:程序博客网 时间:2024/05/29 14:27

负数进制和正数进制类似。对于负数进制,每次取的余数保证在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

余数符号与被除数符号一致

1 0
原创粉丝点击