题目描述
Time Limit: 1000 ms
Memory Limit: 256 mb
二进制转换的问题,想必大家都没有问题了吧,比如给你一个十进制数13,其对应的二进制表示为:1101。因为13=1*2^3+1*2^2+0*2^1+1*2^0.江鸟整天胡思乱想,现在他想到一个问题:如果将平时二进制转换过程中的基数2变成-2,那么转换过来的数将又是什么呢?江鸟将这种转换方式称为“负二进制转换”,为了让大家接受他的理论,他举了个例子如下:
1*(-2)^3+1*(-2)^2+0*(-2)^1+1*(-2)^0=-3,所以-3的该种转换为1101.
输入样例#:
-3
输出样例#:
1101
解析
从小到大各位的位值为1,-2,4,-8,…
- (-3)//(-2)=1…-1
余数-1转为1(末位取决基数偶数,-1代表基数,而此位置只能表示1或0,取1),
此时商为1,余数取1后要加上1(余数+2得到1,商需要-2,但此时被除数是-2,则+1),
得到(-3)//(-2)=2…1
out=1
- 2//(-2)=-1…0
余数0不需要处理
out = 10
- (-1)//(-2)=1…1
余数1,
out = 101
- 1%(-2)=0…1
余数1,不需要处理
商为0,结束循环
out= 1011
最后从后往前输出就是答案1101
代码如下:
#include <stdio.h>
#include <string.h>
int n;
char cnt[10005];
int main(){
while (scanf("%d",&n)!=EOF){
if(n==0){
printf("%d",0);
}else{
memset(cnt,0,10005);
int i = 0;
while(n!=0){
int w = n%(-2);//用于把余数的判断
if(w==-1){//若余数是-1
cnt[i++]=1+'0';
n=n/(-2)+1;
}else{
cnt[i++]=w+'0';
n = n/(-2);
}
}
int len = strlen(cnt);
for(int j=len-1;j>=0;j--){
printf("%c",cnt[j]);
}
}
printf("\n");
}
return 0;
}