1. 程式人生 > >【2018/09/15】T1-進位制拆分-平衡三進位制

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

題目描述

平衡三進位制,是一種以 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;
}