题目的意思就是给出一个数字把它转化成-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");
}
}