有一个变进制系统从低位到高位的权值依次是
,,,,,1,3,7,15,31,… 。即第i(i>=0)位的权值是
2^(i+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
不用担心2,直接从最高位找起就行
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int n,flag,tmp,po[35];
int main()
{
ios::sync_with_stdio(false);
cin>>n;
for(int i=1;i<=30;i++)
po[i]=pow(2,i)-1;
while(n--)
{
cin>>tmp;
if(tmp==0)
{
cout<<0<<endl;continue;
}
int tip=30;
while(po[tip]>tmp) tip--;
while(tip)
{
cout<<tmp/po[tip];
tmp%=po[tip];
tip--;
}
cout<<endl;
}
return 0;
}