uva12111(数论-2进制)

本文详细解释了如何将一个给定的数字转换为其负二进制表示形式,并提供了一个AC代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目的意思就是给出一个数字把它转化成-2进制.

n = b0 + b1(-2) + b2(-2)2 + b3(-2)3 + ...

首先我们可以最直接先把它转化过来.

就是求余-2,在除以-2,一直到除完为止,就得到了一个-2进制的数.

但是这个数里面出了1,0还有-1;所以我们要把-1消掉.

如果我们把-1变成1,那么原本减掉的值就变成加了,就多加了两个,那么就要给它扣掉.而且我们知道,他的下一位和他差-2倍,所以下一位加1,就相当于这一位的值减掉了两个.

所以碰到-1,把他变成1,下一位加1;(因为有加1操作,所以可能出现2)

碰到2,就把他变成0,下一位减1;(因为有减一,所以也可能出现-2)

碰到-2,就把他变成0,下一位加1;


AC代码:


#include<stdio.h>
#include<string.h>
int res[100];
int main () {
	int t;
	int cas = 1;
	scanf("%d",&t);
	while(t--) {
		int num;
		int len = 0;
		memset(res , 0 ,sizeof(res));
		scanf("%d",&num);
		while(num != 0) {
			res[len++] = num % (-2);
			num /= (-2);
		}
		int carry = 0;
		for (int i = 0 ; i <= 100 ; i++) {
			if(res[i] == -1) {
				res[i] = 1;
				res[i + 1]++;
			}
			if(res[i] == 2) {
				res[i] = 0 ;
				res[i + 1]--;
			}
			if(res[i] == -2) {
				res[i] = 0 ;
				res[i + 1]++;
			}
		}
		bool ok = false;
		printf("Case #%d: ",cas++);
		for (int i = 100 ; i >= 0 ;i--) {
			if(!ok && res[i] == 0) {
				continue;
			}
			ok = true;
			printf("%d",res[i]);
		}
		if(!ok) {
			printf("0");
		}
		printf("\n");
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值