【题解】负进制
负进制
借助于对数字理论的研究,奶牛们打算建立一套计数系统。它们打算建立的计数系统是二进制的,但基数为-2,而
不是+2。另它们非常高兴的是,使用-2作为基数表示数字不需要符号位。我们知道进制数每位的权(从右到左)分
别为1(基数的0次方),基数1,基数2,等等。基数为-2的情况下,每位的权分别为1,-2,4,-8,16,-32,
……(从右向左)。因此,从1开始计数依次为:1, 110, 111, 100, 101, 11010, 11011, 11000, 11001
, 等等。令人惊奇的是,使用基数-2,负数也可以用1和0来表示,而且不需要符号位。例如,从-1开始向下计数
依次为:11, 10,1101, 1100, 1111, 等等。请你帮助奶牛转换普通十进制数(范围-2,000,000,000…2,000,0
00,000)到基数为-2的计数系统。
输入
Line 1: 一个需要转换的十进制整数
输出
Line 1: 一个整数,表示输入整数转换为基数为-2后的结果。
输入0,仍然输出一个0。
样例
输入
-13
输出
110111
提示
从右向左读: 11 + 1-2 + 14 + 0-8 +116 + 1-32 = -13
1 #include <bits/stdc++.h> 2 using namespace std; 3 long long sum=0,s[10000],x=0,n; 4 int main(){ 5 cin>>n; 6 if(n==0)cout<<0; 7 else 8 for(int i=1;i<=2000000;i++){ 9 if(n!=0){ 10 sum++; 11 s[sum]=abs(n%(-2));//绝对值 12 if(n%(-2)==-1){//负 13 n=n/-2+1; 14 }else{//正 15 n/=-2; 16 } 17 }else{ 18 break; 19 } 20 } 21 for(int i=sum;i>=1;i--){ 22 if(x!=0)cout<<s[i]; 23 if(!x){ 24 if(s[i]!=0){ 25 x=1; 26 cout<<s[i]; 27 } 28 } 29 } 30 return 0; 31 }