负二进制

481 阅读1分钟

题目描述

二进制转换的问题,想必大家都没有问题了吧,比如给你一个十进制数13,其对应的二进制表示为:1101。因为13 = 1* 2^3+1 * 2^2+0 * 2^1+1 * 2^0。

江鸟整天胡思乱想,现在他想到一个问题:如果将平时二进制转换过程中的基数2变成-2,那么转换过来的数将又是什么呢?江鸟将这种转换方式称为“负二进制转换”,为了让大家接受他的理论,他举了个例子如下:
1*(-2)^3+1*(-2)^2+0*(-2)^1+1*(-2)^0=-3,所以-3的该种转换为1101。

输入描述

有多组测试数据。 输入为一个整数M。-100000<=M<=100000

输出描述

输出该种转换得到的结果(输出结果为只有0和1表示的一个串)

示例

输入:-3
输出:1101

思路

  • 只用判断余数即可,余数只能是1、0,不能是-1。

  • 若不是-1,正常存入数组即可。

  • 若为-1,则将其变为1,且n/2后要+1。

具体实现

#include<bits/stdc++.h>
using namespace std;
int main(){  
	int n;
	while(cin>>n){
		int a[100],cnt=0;
		if(n==0) cout<<0;
		while(n!=0){ //不能n>0,因为输入可能<0 
			a[cnt] = n%(-2);
			n/=(-2);
			if(a[cnt]==-1){ //判断余数是否是-1
				a[cnt]=1; //余数取1 
				n++; // n+1 
			}
			cnt++;
		}
		for(int i=cnt-1; i>=0; i--){
			cout<<a[i];
		}
		
		cout<<endl;
	}
	return 0;
}

小结

因为是负二进制,基数为-2,所以正数十进制转二进制的结果和这个不一样。