How to convert from unbalanced to balanced ternary?
我的目标是将十进制数转换为平衡的三进制数。从十进制转换为不平衡的三进制只需要除以 3 并跟踪余数。一旦我有了数字的不平衡三元表示,我似乎无法弄清楚如何"平衡"它。
例如:十进制的 15 是不平衡三进制的 120 和平衡三进制的 --0。我如何从 120 转到 --0?我不知道如何处理不平衡三元表示中的 2。
谢谢!
请注意,三进制中的 2 是平衡三进制中的 - 或十进制中的 2 = 3 - 1。因此,如果您从一个填充有 0、1 和 2 的数组开始,只需将每个 2 替换为 -1 并添加 1到它左边的数字。 (确保在数字的开头有一个额外的 0,至少如果它以 2 开头。)根据您进行替换的方式,您可能还需要将 3 替换为 0,像往常一样在左侧添加 1。然后重复这个过程,直到没有更多的 2s(或 3s)。
一种看待它的方式是,如果您得到余数 然后将其转换为简单的三进制转换,需要额外的检查。 可以在此处找到正在运行的程序。1
2
3
4
5
6
7
8
9
10String output="";
while (n>0) {
rem = n%3;
n = n/3;
if (rem == 2) {
rem = -1;
n++;
}
output = (rem==0?'0':(rem==1)?'+':'-') + output;
}
n
n
因为我在互联网上错过了这个,这里是我自己在 Pari/GP 中的实现 -
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | {balanced_ternary(x,maxdigits=20,chars=["y","0","1"])=my(res,st,dez,dig); dez=floor(log(abs(2*x))/log(3)); res=x/3^dez; st=""; for(k=0,maxdigits, if(k==dez+1,st=Str(st,".")); dig = if(res>1/2 ,res--;chars[2+1] ,if(res<-1/2 ,res++;chars[2-1] ,chars[2+0] )); st=Str(st,dig);res*=3 ); return(st);} |
然后
1 2 3 4 5 6 7 8 9 | balancedternary (1) \\\\ %1002 ="1.00000000000000000000" balancedternary (-1) \\\\ %1003 ="y.00000000000000000000" balancedternary (1.2) \\\\ %1004 ="1.1yy11yy11yy11yy11yy1" balancedternary (-1.2) \\\\ %1005 ="y.y11yy11yy11yy11yy11y" balancedternary (27-3) \\\\ %1006 ="10y0.00000000000000000" balancedternary (400) \\\\ %1007 ="1yy0y11.00000000000000" balancedternary (sqrt(3)) \\\\ %1008 ="1y.y1yy10y0000yy1100y0" balancedternary (sqrt(3)/3) \\\\ %1009 ="1.yy1yy10y0000yy1100y0" |
只是q