题目描述
平衡三进制分别使用字符'-','0','1'表示-1,0,1。下表表示从0到10的十进制数对应的平衡三进制的值。
现在给你一个十进制整数,请将其转成对应的平衡三进制的串。
十进制 | 平衡三进制 |
0 | 0 |
1 | 1 |
2 | 1- |
3 | 10 |
4 | 11 |
5 | 1-- |
6 | 1-0 |
7 | 1-1 |
8 | 10- |
9 | 100 |
10 | 101 |
输入
第一行是一个整数N,表示样例的个数。以后每行一个非负整数x,0≤x≤2^31-1。
输出
每行输出一个样例的结果。
样例输入
8 0 1 2 14 19 27 61 37726
样例输出
0 1 1-
1--- 1-01 1000 1-1-1 1-0-1-1-1-1
AC代码
#include<stdio.h>
int main()
{
int T;
scanf("%d",&T);
while(T--){
int n,i=0,j;
scanf("%d",&n);
char a[25]={};//存放对应三进制的字符
if(n==0)printf("0\n");
else{
while(n!=0){
if(n%3==0){
a[i]='0';
n/=3;
}
else if(n%3==1){
a[i]='1';
n/=3;
}
else{
a[i]='-';
n=n/3+1;
}
i++;
}
for(j=i-1;j>=0;j--){
printf("%c",a[j]);
}
printf("\n");
}
}
}
解题思路:首先我们要理解10进制转平衡三进制的思路。2的平衡三进制是1-,实际上就是3-1。
传统转三进制的方法
while(n!=0){
a[cnt]=n%b;
n/=b;
cnt++;
}
可以发现每次运算都在对b取模,同理,考虑平衡三进制也对b取模。例如3%3=0,3/3=1,1%3=1,1/3=0,a[0]=0,a[1]=1,a[i]也是n模3的余数。考虑特殊情况2,2%3=2,2/3=0,a[0]='-',a[1]=1;由此发现n%3=0,a[i]=0,此时令n/=3;当n%3=1时,a[i]=1,也令n/=3;当n%3=2时,a[i]='-',令n=n/3+1;利用循环重复以上的步骤即可。注意:输出结果要从最高位开始。