【2018/09/15】T1-進位制拆分-平衡三進位制
阿新 • • 發佈:2018-12-10
題目描述
平衡三進位制,是一種以 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; }