题目

有一个变进制系统从低位到高位的权值依次是 1,3,7,15,31,… 。即第i(i>=0)位的权值是 2𝑖+1−1 。每一位数字是0,1,或者2。现在有一个十进制的数字n,想要把它转换成变进制系统下面的表示。由于有2的存在,这种转换可能会有多种可能,现在规定2只能作为最低非0位出现,这种情况下,表示就唯一了。

比如44可能用15+15+7+7(2200)来表示,但是这样前面那个2就没有作为最低非0位出现,所以不符合要求,正确的转换是10120。

输入

多组测试数据。 第一行有一个整数T(1<=T<=5),表示测试数据的数目。 接下来T行,每行一个整数n(0<=n<=1000000000)。

输出

对于每一个n,输出它的变进制表示。

输入样例

样例输入1

4
1
2
3
4

输出样例 样例输出1

1
2
10
11

解法:

暴力即可

代码:

#include<stdio.h>
#include<algorithm>
#include<cmath>
#include<queue>
using namespace std;
typedef long long ll;
ll POW(ll n, ll m)
{
    ll ans = 1;
    for(int i = 0; i < m; i++)
        ans *= n;
    return ans;
}
int main()
{
    int t;
    scanf("%d", &t);
    while(t--){
        ll n,p;
        scanf("%lld", &n);
        if(n == 0)
            {
                printf("0\n");
                continue;
            }
        queue<int> q;
        for(int i = 0; i < 40; i++){
            while(!q.empty())
                q.pop();
            p = n - 2*POW(2,i) + 2;
            for(int j = 35; j >= 1; j--)
            {
                if(j == i){
                    q.push(2);
                    if(p != 0){
                        p = -1;
                        break;
                    }
                    continue;
                }
                if(p >= POW(2,j) - 1){
                    p -= POW(2,j) - 1;
                    q.push(1);
                }
                else{
                    q.push(0);
                }
            }
            if(p == 0){
                while(q.front() == 0){
                    q.pop();
                }
                while(!q.empty()){
                    printf("%d",q.front());
                    q.pop();
                }
                break;
            }
        }
        printf("\n");
    }
}