【2018/09/15】T1-进制拆分-平衡三进制

版权声明:虽然我只是个小蒟蒻但转载也请注明出处哦 https://blog.csdn.net/weixin_42557561/article/details/82718231

题目描述

平衡三进制,是一种以 3 为基数,-1(以下用T表示)、0、1 为基本数码的进制。由于 -1 的引入,这种进制不需要额外的符号就能直接表示负数。正因为这一点,使得平衡三进制在加减法和乘法方面的效率要比二进制高。

美国著名计算机学家高德纳在《编程的艺术》一书中指出,“也许最美的进制是平衡三进制”。

平衡三进制和其他进制一样,各位的数字和位权相乘然后叠加起来,就是该数的数值。

从低位到高位数第 i 位(从0开始计数)的权值就是 3i 。如十进制数 2 可以表示为 1T ,因为 2 = 1×31 + (-1) ×30 。同理可以表示负数,如 -6 可以表示为 T10 。

平衡三进制不需要额外的符号就可以表示负数。第一个非 0 位是 T 的为负数,第一个非 0 位是 1 的是正数。

在平衡三进制中,各位上的数字之和为偶数的整数是偶数;各位上的数字之和为奇数的整数是奇数。

在平衡三进制中,四舍五入和截位的操作是等效的。

现在,你需要完成十进制到平衡三进制的转换。

输入格式

第一行一个数Q,表示有Q组数据。
下面 Q 行,每行一个整数 x ,表示要转化的十进制数。

输出格式

对于 Q 行中的每一行,输出对应的平衡三进制数。

样例数据 1

输入  

6
-13
-10
-6
0
2
8

输出

TTT
T0T
T10
0
1T
10T

备注

【数据规模与约定】
对于 10% 的数据, |x|≤13 。
对于 30% 的数据, |x|≤7174453 。
对于另 30% 的数据, x≥0 。
对于 100% 的数据, |x|≤1018;1≤Q≤104 。

分析

先将这个数转化为一般状况下的三进制数,然后遇到>=2的位置,就把这个位置 -3 ,然后向高位进1,就搞完了

我也不知道我怎么就傻逼的想复杂了……哎哎哎哎

代码

#include<bits/stdc++.h>
#define in read()
#define ll long long
using namespace std;
inline int read(){
	char ch;int res=0;
	while((ch=getchar())<'0'||ch>'9');
	while(ch>='0'&&ch<='9'){
		res=(res<<3)+(res<<1)+ch-'0';
		ch=getchar();
	}
	return res;	
}
int q,a[100];
ll x;
int main(){

	q=in;
	while(q--){
		memset(a,0,sizeof(a));
		int f=1;
		scanf("%lld",&x);
		if(x==0){
			cout<<0<<endl;
			continue;
		} 
		if(x<0) f=-1,x=-x;
		int t=0;
		while(x){
			a[++t]=x%3;
			x=x/3;
		}
		for(int i=1;i<=t;++i){
			if(a[i]>=2) a[i]-=3,a[i+1]++;
		}	
		if(f==1){
			if(a[t+1]==1) cout<<1;
			if(a[t+1]==2) cout<<"1T";
			if(a[t+1]==3) cout<<"10";
			for(int i=t;i>=1;--i)
				if(a[i]==-1) cout<<"T";
				else cout<<a[i];
			cout<<endl;
		}
		else{
			if(a[t+1]==1) cout<<"T";
			if(a[t+1]==2) cout<<"T1";
			if(a[t+1]==3) cout<<"T0";
			for(int i=t;i>=1;--i)
			{	
				if(a[i]==-1) cout<<1;
				if(a[i]==1) cout<<"T";
				if(a[i]==0) cout<<0;
		 	}
			cout<<endl;
		}
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_42557561/article/details/82718231
今日推荐