The Moronic Cowmpouter
|
Time Limit: 1000MS |
Memory Limit: 65536K |
|
|
Total Submissions: 2402 |
Accepted: 1227 |
Description
Inexperienced in the digital arts, the cows tried to build a
calculating engine (yes, it's a cowmpouter) using binary numbers (base 2) but
instead built one based on base negative 2! They were quite pleased since
numbers expressed in base −2 do not have a sign bit.
You know number bases have place values that start at 1 (base to the 0 power)
and proceed right-to-left to base^1, base^2, and so on. In base −2, the place
values are 1, −2, 4, −8, 16, −32, ... (reading from right to left). Thus,
counting from 1 goes like this: 1, 110, 111, 100, 101, 11010, 11011, 11000,
11001, and so on.
Eerily, negative numbers are also represented with 1's and 0's but no sign.
Consider counting from −1 downward: 11, 10, 1101, 1100, 1111, and so on.
Please help the cows convert ordinary decimal integers (range
-2,000,000,000..2,000,000,000) to their counterpart representation in base −2.
Input
Line 1: A single integer to be converted to base −2
Output
Line 1: A single integer with no leading zeroes that is the input integer converted to base −2. The value 0 is expressed as 0, with exactly one 0.
Sample Input
-13
Sample Output
110111
Hint
Explanation of the sample:
Reading from right-to-left:
1*1 + 1*-2 + 1*4 + 0*-8 +1*16 + 1*-32 = -13
Source
解题报告:这道题是让求负二进制,先打表储存每位的可以表示的最大值和最小值,在枚举即可;
代码如下:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
const int MAX = 33;
struct node
{
__int64 low;
__int64 high;
}a[MAX];//存储第i个位置可以表示的最大值和最小值
int main()
{
int i;
__int64 n;
a[0].low = 0;
a[0].high = 1;
for (i = 1; i < MAX; ++i)
{
if (i % 2)//这种位置上是表示的负数
{
if (i > 2)
{
a[i].low = -pow(2, i) + a[i - 2].low;
a[i].high = a[i - 2].low;
}
else//边界处理
{
a[i].low = -pow(2, i);
a[i].high = 0;
}
}
else//正数的时候
{
a[i].high = pow(2, i) + a[i - 2].high;
a[i].low = a[i - 2].high;
}
}
scanf("%I64d", &n);
int temp;//存储二进制的位数
if (n < 0)
{
for (i = 1; i < MAX; i = i + 2)//负数的时候
{
if (a[i].low <= n)
{
temp = i;
break;
}
}
}
else
{
for (i = 0; i < MAX; i = i + 2)//正数的时候
{
if (a[i].high >= n)
{
temp = i;
break;
}
}
}
for (i = temp; i >= 0; i --)
{
int flag = 0;
//把正负数分开主要是因为边界问题正数的时候是a[i].high >= n,而负数的时候是a[i].high > n
if (a[i].high >= n && n > a[i].low && n > 0)//正数的时候
{
printf("1");
flag = 1;
}
else if(a[i].low <= n && a[i].high > n && n < 0)//负数的时候
{
printf("1");
flag = 1;
}
else
{
printf("0");
}
if (flag)
{
if (i % 2)//正数的时候
{
n += pow(2, i);
}
else//负数的时候
{
n -= pow(2, i);
}
}
}
printf("\n");
return 0;
}
浙公网安备 33010602011771号