uva 11121 - Base -2(负进制转换)

179 篇文章 0 订阅

题目连接:uva 11121 - Base -2


题目大意:给出一个十进制的数,将这个数转换成-2进制的数。


解题思路:进制转化是一种很简单的题型,可是对于负数的进制来说我就很陌生了,研究了蛮久的,这里分享一下。


首先要了解如何将一个-2进制的数转换成十进制数,例如7对应的-2进制数即为11011;

1 * (-2) ^ 4 + 1 * (-2) ^ 3 + 0 * (-2) ^ 2 + 1 * (-2) ^ 1 + 1 * (-2) ^ 0 = 16 - 8 + 0 - 2 + 1 = 7(和2进制转10进制是一个道理)


其次n / (-2) = - (n / 2) ;当n ≥ 0时,n % (-2)  = n % 2, 当n < 0时, n % (-2)  =  - (|n| % 2);这样写出来方便理解。


最后就是进制的转换了,10进制转2进制的大家都会,就是每次模2,取整。其实转-2进制也是一样的,每次模-2,取整,可是这里就涉及到符号的问题。


例: 以7为例子

a)7%(-2)=1, 7/(-2)=-3 ---------  -3 * (-2) ^ 1 + 1 * (-2) ^ 0 = 6 + 1 = 7 ;-3、1

b)-3% (-2) = -1    -3/(-2) = 1---------- -1 *(-2) ^ 2 + (-1) * (-2) ^ 1 + 1 * (-2) ^ 0 = 4 + 2 + 1 = 7;1、-1、1

可是这里出现了-1,-1不能在这里面出现,所以只能尝试将等价的数值转移到高位,或是低位,可是转移到低位是要进位的,所以使不可取的,只能转向高位;现在假设当前为-1的位为当前位,那当当前位的高位增加1时,对应则是当前位的数值增加2,若要保持数值的不变,则要减去增加的数值,若减在高位上则没有改变,所以只能减在当前位上。


即 2、-1 - (-2)、1 (会出现模-2小于0的肯定是奇数为,奇数位要注意符号为负) 2 、 1、1

2 * (-2) ^ 2 + 1 * (-2) ^ 1 + 0 * (-2) ^ 0 = 8 - 2 + 1 = 7   

重复执行a、b,直到取整为0,就可以得到答案。


归纳:其他的-bas进制,也是以同样的方式进行进制转换,只是对应的负数a,a + bas。


#include <stdio.h>
#include <string.h>
#include <math.h>
const int tmp = -2;

void base() {
	int n, i, num[105];
	memset(num, 0, sizeof(num));
	scanf("%d", &n);
	for (i = 0; n; i++) {
		num[i] = n % tmp;
		n = n / tmp;
		if (num[i] == -1) {
			num[i] = 1, n++;
		}
	}
	while (--i > 0) {
		printf("%d", num[i]);
	}
	printf("%d\n",  num[0]);
}

int main() {
	int cas, ti = 1;
	scanf("%d", &cas);
	while (cas--) {
		printf("Case #%d: ", ti++);
		base();
	}
	return 0;
}


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值