poj3191(负进位制)

题目链接:https://vjudge.net/problem/POJ-3191

题意:将一个int范围的整数用-2进制表示并输出。

思路:将十进制转换成-2进制,原理也类似于短除法。但不同的是不是简单的取模,因为在复数方面对余数的定义可能造成二义性。假设要转换成a进制(a<0),一般的做法是找到最小的非负整数x,使得当前的数减x能被a整除,这个x就将作为新的最高位写到结果中去,然后当前数减x除以a。直到当前数为0。

AC代码:

#include<cstdio>
using namespace std;

int n,k;
int a[1005];

int main(){
    scanf("%d",&n);
    if(n==0){
        printf("0
");
        return 0;
    }
    while(n){
        int tmp=n%2;
        if(n<0) tmp=-tmp;
        a[k++]=tmp;
        n=(n-tmp)/(-2);
    }
    for(int i=k-1;i>=0;--i)
        printf("%d",a[i]);
    printf("
");
    return 0;
}
原文地址:https://www.cnblogs.com/FrankChen831X/p/10824157.html