POJ 3191 The Moronic Cowmpouter

题目大意:

        由于对数字艺术不敏感,cows只能尝试建造一台计算引擎帮他完成一些计算工作(而不能凭自己的直觉来解决问题了)。他打算设计一个十进制向二进制转换的程序,但不过不是二进制而是负二进制的,并且他们发现用负二进制表示数字时可以不需要符号位!他们开心极了。

        同样,-2进制各位权值计算方法和普通进制一样,最低位为1,依次往上为-2( (-2)^1 ),4( (-2)^2 ),-8( (-2)^3 )......,因此10进制的1, 2, 3, 4在-2进制中就表示为1, 110, 111, 100,怪异的是10进制负数用-2进制表示同样也只包含0和1而不带符号位,例如-1, -2, -3, -4在-2进制中表示为11, 10, 1101, 1100, 1111

        现只有一个测例,测例中给出一个整数n(-2,000,000,000 ≤ n ≤ 2,000,000,000),将其转换成-2进制数并输出。

题目链接

注释代码:

/*                            
 * Problem ID : POJ 3191 The Moronic Cowmpouter
 * Author     : Lirx.t.Una                            
 * Language   : C               
 * Run Time   : 0 ms                            
 * Run Memory : 176 KB                            
*/  

#include <stdio.h>

//正基数
#define	BASE		2
//reverse base
//反基数
#define	VBASE		-2

#define	MAXSTKSIZE		1000

int		stk[MAXSTKSIZE];//栈

int
main() {

	int		n;//输入的十进制数
	int		top;//栈顶
	int		i;//计数变量

	scanf("%d", &n);

	if ( !n ) {
	
		puts("0");
		return 0;
	}

	top = 0;
	while ( n ) {

		stk[++top] = n % BASE;

		if ( n < 0 )//如果n为负数,“余数”需取反
			//因为-2进制不带符号位,因此每一位必然是
			//1或者0而不可能会是一个负数
			stk[top] = -stk[top];

		n -= stk[top];//将余数减去
		n /= VBASE;//进制右移一位
	}

	while ( top )
		printf("%d", stk[top--]);
	putchar('\n');

	return 0;
}

无注释代码:

#include <stdio.h>

#define	BASE		2
#define	VBASE		-2

#define	MAXSTKSIZE		1000

int		stk[MAXSTKSIZE];

int
main() {

	int		n;
	int		top;
	int		i;

	scanf("%d", &n);

	if ( !n ) {
	
		puts("0");
		return 0;
	}

	top = 0;
	while ( n ) {

		stk[++top] = n % BASE;

		if ( n < 0 )
			stk[top] = -stk[top];

		n -= stk[top];
		n /= VBASE;
	}

	while ( top )
		printf("%d", stk[top--]);
	putchar('\n');

	return 0;
}

单词解释:

moronic:adj, 低能的,迟钝的

inexperienced:adj, 缺乏经验的

pleased:adj, 高兴的,欢喜的

sign:n, 符号

sign bit:n, 符号位

power:n, 指数,幂

eerily:adj/adv, 怪诞,奇异

counterpart:n, 副本,配对物

express:vt, 表达,表示; n, 快递

explanation:n, 说明,解释

bronze:n, 青铜; adj, 青铜色的

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值