奇怪的电脑

Time Limit : 3000/1000ms (Java/Other)   Memory Limit : 65535/32768K (Java/Other)

Total Submission(s) : 21   Accepted Submission(s) : 14

Font: Times New Roman | Verdana | Georgia

Font Size: ← →

Problem Description

易凯与他的小伙伴们有一个伟大的构想: 他们要自己制造一台计算机。为了显示这台计算机的与众不同, 他们决定让这台计算机使用 -2 进制。 他们为自己的创意而骄傲,因为在这台计算机里,不需要符号位就可以表示所有整数。
众所周知,一个数字的值是它各位的数值与该位所对应的基数幂次的乘积和。在-2 进制中,从右往左各位所对应的基数幂次分别为 1,-2,4,-8,16,-32,...因此,1,2,3...这些正整数对应的-2 进制数分别为 1,110,111,100,101,11010,11011,11000,11001...
在-2 进制中,负数同样是用 0 与 1 组成的字符串表示,不过在这里符号位是多余的了。 -1 以及比它小的负整数对应的-2 进制数为 11,10,1101,1100,1111...
请你帮助易凯与他的小伙伴们完成常用整数与它们所对应的-2 进制整数之间的转换。
这些数的取值范围在区间[-2*10^9,2*10^9]内。

输入:-13
输出说明:
从右往左计算这个-2 进制数所对应的值:
1*1 + 1*(-2) + 1*4 + 0*(-8) +1*16 + 1*(-32) = -13

Input

每包含一个整数,为需要转换成-2 进制的数

Output

每行为一个没有前导 0 的整数,即与输入数据等值的-2 进制数。对于值
为 0 的输入,你的程序应该输出单独的一个0。

Sample Input

-13

Sample Output

110111

Author

tianzuwei

这道题显然就是一个十进制转化为-2进制的题目。我们可以想一想10进制如何转化为2进制的。那么我们也可以模拟10进制转化为-2进制的过程。就是一个数n/-2然后取其余数。但是有一点要注意,余数要为正的。所以我们要处理一下数据,把计算出来的余数取其绝对值,同时将这个数减去余数然后再除以-2的话就可以算出正确的结果啦。以下是ac的代码。

#include <iostream>
#include <stack>
#include <algorithm>
using namespace std;
int main()
{
	char num[40005];
	int  n;
	while(cin>>n)
	{
		stack <int> s;
		int a;
		if(n == 0)
		cout<<0<<endl;
		else
		{
			while(n!=0)
		{
		a = abs(n%(-2));
		s.push(a);
		n = (n-a) / (-2);
		}
		}
		while(!s.empty())
		{
			cout<<s.top();
			s.pop();
		}
		cout<<"\n";
	}
	return 0;
}

 

声明:本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。