(算法)负二进制

题目描述

Time Limit: 1000 ms
Memory Limit: 256 mb
二进制转换的问题,想必大家都没有问题了吧,比如给你一个十进制数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.

输入样例#:
-3
输出样例#:
1101

解析

从小到大各位的位值为1,-2,4,-8,…

  • (-3)//(-2)=1…-1
    余数-1转为1(末位取决基数偶数,-1代表基数,而此位置只能表示1或0,取1),
    此时商为1,余数取1后要加上1(余数+2得到1,商需要-2,但此时被除数是-2,则+1),
    得到(-3)//(-2)=2…1
out=1
  • 2//(-2)=-1…0
    余数0不需要处理
 out = 10
  • (-1)//(-2)=1…1
    余数1,
 out = 101
  • 1%(-2)=0…1
    余数1,不需要处理
    商为0,结束循环
out= 1011

最后从后往前输出就是答案1101
代码如下:

#include <stdio.h>
#include <string.h>

int n;
char cnt[10005];


int main(){
	while (scanf("%d",&n)!=EOF){
		if(n==0){
			printf("%d",0);
		}else{
			memset(cnt,0,10005);
			int i = 0;
			while(n!=0){
				int w = n%(-2);//用于把余数的判断
				if(w==-1){//若余数是-1
					cnt[i++]=1+'0';
					n=n/(-2)+1;
				}else{
					cnt[i++]=w+'0';
					n = n/(-2);
				}
			}
			int len = strlen(cnt);
			for(int j=len-1;j>=0;j--){
				printf("%c",cnt[j]);
			}
		}
		printf("\n");
	}
	return 0;
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值