本文为翻译文章
原文链接 :https://cp-algorithms.com/algebra/balanced-ternary.html
平衡三进制(Balanced Ternary)
介绍
这是一个不太标准的数字符号系统(numeral system)。它的特点是每一位数字可以是-1
, 0
和1
。它是一个基于三进制的数字符号系统。因为使用-1
来作为一个数字不太方便,我们接下来会使用字母Z
来代替-1
。图片里展示的是一台使用这种系统的计算机。
下面是一些使用这种平衡三进制来表示的数字:
0 0
1 1
2 1Z
3 10
4 11
5 1ZZ
6 1Z0
7 1Z1
8 10Z
9 100
这种符号系统允许你在书写符号的时候不使用前置的负号:在将正数转换成负数时,你需要将每一位数字转置( 1
变成Z
,Z
变成1
)。
-1 Z
-2 Z1
-3 Z0
-4 ZZ
-5 Z11
注意到,负数都是Z
开头,正数都是1
开头。
转换算法
通过将一个给定的数转换成普通的三进制形式,我们很容易将它表示成平衡三进制的形式。当一个数以三进制的形式表示时,它的每一位都是0
, 1
, 2
中的一个数。要将它转换成平衡三进制,我们从低位开始,如果遇到了0
或1
,那么这一位保持不变,如果遇到数字2
,那么将1
变成Z
,并且让下一位加1
。如果加1
后变成了数字3
,3
应该变成0
,并且下一位要加1
。
例1:将64
转换成平衡三进制。首先我们先将64
写成普通的三进制数形式:
6
4
10
=
0210
1
3
64_{10} = 02101_{3}
6410=021013
我们从最右边一位开始处理:
1
,0
,1
被跳过,保持不变。2
被转换成Z
并且左边以为加1
,我们得到了1Z101
。
最终的结果是1Z101
。
我们通过把每一位的权重加起来把它转换成普通的10进制数字:
1
Z
101
=
81
⋅
1
+
27
⋅
(
−
1
)
+
9
⋅
1
+
3
⋅
0
+
1
⋅
1
=
6
4
10
1Z101 = 81 \cdot 1 + 27 \cdot (-1) + 9 \cdot 1 + 3 \cdot 0 + 1 \cdot 1 = 64_{10}
1Z101=81⋅1+27⋅(−1)+9⋅1+3⋅0+1⋅1=6410
例2:将237
平衡三进制。首先我们先将237
写成普通的三进制数形式:
23
7
10
=
222103
237_{10} = 22210{3}
23710=222103
我们从最右边一位开始处理:
0
,1
被跳过,保持不变。2
被转换成Z
,左边一位加1
,我们得到了23Z10
。3
被转换成0
,左边一位加1
,我们得到了30Z10
。3
被转换成0
,左边以为加1
,我们得到了100Z10
。
最终的结果是100Z10
。
我们将它转换成普通的10进制数字:
10
Z
10
=
243
⋅
1
+
81
⋅
0
+
27
⋅
0
+
9
⋅
(
−
1
)
+
3
⋅
1
+
1
⋅
0
=
27
3
10
10Z10 = 243 \cdot 1 + 81 \cdot 0 + 27 \cdot 0 + 9 \cdot (-1) + 3 \cdot 1 + 1 \cdot 0 = 273_{10}
10Z10=243⋅1+81⋅0+27⋅0+9⋅(−1)+3⋅1+1⋅0=27310