奇怪的电脑
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;
}