http://oj.acm.zstu.edu.cn/JudgeOnline/problem.php?id=4435

C++版本一

题解:

负进制,头一次听说

根据进制转换的权值来类比

1 -2 4 -8

奇次幂是负数说明在这个位置上有个1,不是加而是减一个权值

其他的见代码

/*
*@Author:   STZG
*@Language: C++
*/
#include <bits/stdc++.h>
#include<iostream>
#include<algorithm>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<string>
#include<vector>
#include<bitset>
#include<queue>
#include<deque>
#include<stack>
#include<cmath>
#include<list>
#include<map>
#include<set>
//#define DEBUG

using namespace std;
typedef long long ll;
const int N=100;
const double PI = acos(-1.0);
const double EXP = 1E-8;
const int INF = 0x3f3f3f3f;
int t,n,m,k;
bool a[N];
int main()
{
#ifdef DEBUG
	freopen("input.in", "r", stdin);
	//freopen("output.out", "w", stdout);
#endif
    scanf("%d",&t);
    while(t--){
        scanf("%d%d",&n,&k);
        int cnt=0;
        if(n==0){
            cout<<0<<endl;
            continue;
        }
        if(k==2){
            while(n!=0){
                a[cnt++]=n%2;
                n/=2;
            }
        }else{
            while(n!=0){
                a[cnt++]=n%2;
                if(a[cnt-1]==1&&cnt%2==0)
                    n=(n+1)/2;
                else
                    n/=2;
            }
        }
        for(int i=cnt-1;i>=0;i--){
            cout<<a[i];
        }
        cout<<endl;

    }

    //cout << "Hello world!" << endl;
    return 0;
}

 

C++版本二

题解:本题关键在-2 进制如何解决
 在做2 进制的时候,我们是直接对n=n/2,忽略掉将n 减去余数的过程,因为int 的除法会向下取整。
 对于-2 进制,我们只要补回减去余数的过程就可以了。 

#include<bits/stdc++.h>
using namespace std;

int ans[50], en;
int main()
{
//    freopen("data1.in", "r", stdin);
//    freopen("check1.out", "w", stdout);
    int t;
    scanf("%d", &t);
    assert(t <= 110);
    while(t--){
        int n, k;
        scanf("%d%d", &n, &k);
        assert(n <= 1000000000 && n >= 0);
        assert(k == 2 || k == -2);
        int gg = n;
        en = 0;
        while(n){
            ans[en] = n & 1;
            n >>= 1;
            if((en & 1) && (ans[en] & 1) && k == -2)    n++;
            en++;
        }
        if(en){
            for(int i = en - 1; i >= 0; --i) printf("%d", ans[i]);
            puts("");
        }
        else{
            puts("0");
        }
    }
    return 0;
}

C++版本三


#include<bits/stdc++.h>

using namespace std;
typedef long long ll;
const int N=1e5+5;

int main(void){
    int n;
    int k;
    int T;
    scanf("%d",&T);
    while(T--){
        scanf("%d%d",&n,&k);
        if(n==0){
            cout << 0 << endl;
            continue;
        }
    //    cout <<n<<" "<<k<<endl;
        if(k==-2){
            string ans="";
            while(n){
                ll t=n%(-2);
                n/=(-2);
                if(t<0) t+=2,n++;// ¼ÇµÃ++
                ans+='0'+t;
            }
            reverse(ans.begin(),ans.end());
            cout << ans << endl;
        }
        else if(k==2){
            string ans="";
            while(n){
                ll t=n%2;
                n/=2;
                ans+='0'+t;
            }
            reverse(ans.begin(),ans.end());
            cout << ans << endl;
        }
    }
    return 0;
}