Balanced ternary: Difference between revisions
Content added Content deleted
m (→{{header|REXX}}: added/changed whitespace and comments, simplified some code.) |
(Balanced ternary en FreeBASIC) |
||
Line 1,843: | Line 1,843: | ||
ok |
ok |
||
</lang> |
</lang> |
||
=={{header|FreeBASIC}}== |
|||
{{trans|Liberty BASIC}} |
|||
<lang freebasic> |
|||
#define MAX(a, b) iif((a) > (b), (a), (b)) |
|||
Dim Shared As Integer pow, signo |
|||
Dim Shared As String t |
|||
t = "-0+" |
|||
Function deci(cadena As String) As Integer |
|||
Dim As Integer i, deci1 |
|||
Dim As String c1S |
|||
pow = 1 |
|||
For i = Len(cadena) To 1 Step -1 |
|||
c1S = Mid(cadena,i,1) |
|||
signo = Instr(t, c1S)-2 |
|||
deci1 = deci1 + pow * signo |
|||
pow *= 3 |
|||
Next i |
|||
Return deci1 |
|||
End Function |
|||
Function ternary(n As Integer) As String |
|||
Dim As String ternario |
|||
Dim As Integer i, k |
|||
While Abs(n) > 3^k/2 |
|||
k += 1 |
|||
Wend |
|||
k -= 1 |
|||
pow = 3^k |
|||
For i = k To 0 Step -1 |
|||
signo = (n>0) - (n<0) |
|||
signo *= (Abs(n) > pow/2) |
|||
ternario += Mid(t,signo+2,1) |
|||
n -= signo*pow |
|||
pow /= 3 |
|||
Next |
|||
If ternario = "" Then ternario = "0" |
|||
Return ternario |
|||
End Function |
|||
Function negate(cadena As String) As String |
|||
Dim As String negar = "" |
|||
For i As Integer = 1 To Len(cadena) |
|||
negar += Mid(t, 4-Instr(t, Mid(cadena,i,1)), 1) |
|||
Next i |
|||
Return negar |
|||
End Function |
|||
Function pad(cadenaA As String, n As Integer) As String |
|||
Dim As String relleno = cadenaA |
|||
While Len(relleno) < n |
|||
relleno = "0" + relleno |
|||
Wend |
|||
Return relleno |
|||
End Function |
|||
Function addTernary(cadenaA As String, cadenaB As String) As String |
|||
Dim As Integer l = max(Len(cadenaA), Len(cadenaB)) |
|||
Dim As Integer i, x, y, z |
|||
cadenaA = pad(cadenaA, l) |
|||
cadenaB = pad(cadenaB, l) |
|||
Dim As String resultado = "" |
|||
Dim As Byte llevar = 0 |
|||
For i = l To 1 Step -1 |
|||
x = Instr(t, Mid(cadenaA,i,1))-2 |
|||
y = Instr(t, Mid(cadenaB,i,1))-2 |
|||
z = x + y + llevar |
|||
If Abs(z) < 2 Then |
|||
llevar = 0 |
|||
Elseif z > 0 Then |
|||
llevar = 1: z -= 3 |
|||
Elseif z < 0 Then |
|||
llevar = -1: z += 3 |
|||
End If |
|||
resultado = Mid(t,z+2,1) + resultado |
|||
Next i |
|||
If llevar <> 0 Then resultado = Mid(t,llevar+2,1) + resultado |
|||
i = 0 |
|||
While Mid(resultado,i+1,1) = "0" |
|||
i += 1 |
|||
Wend |
|||
resultado = Mid(resultado,i+1) |
|||
If resultado = "" Then resultado = "0" |
|||
Return resultado |
|||
End Function |
|||
Function subTernary(cadenaA As String, cadenaB As String) As String |
|||
Return addTernary(cadenaA, negate(cadenaB)) |
|||
End Function |
|||
Function multTernary(cadenaA As String, cadenaB As String) As String |
|||
Dim As String resultado = "" |
|||
Dim As String tS = "", cambio = "" |
|||
For i As Integer = Len(cadenaA) To 1 Step -1 |
|||
Select Case Mid(cadenaA,i,1) |
|||
Case "+": tS = cadenaB |
|||
Case "0": tS = "0" |
|||
Case "-": tS = negate(cadenaB) |
|||
End Select |
|||
resultado = addTernary(resultado, tS + cambio) |
|||
cambio += "0" |
|||
Next i |
|||
Return resultado |
|||
End Function |
|||
Dim As String cadenaA = "+-0++0+" |
|||
Dim As Integer a = deci(cadenaA) |
|||
Print " a:", a, cadenaA |
|||
Dim As Integer b = -436 |
|||
Dim As String cadenaB = ternary(b) |
|||
Print " b:", b, cadenaB |
|||
Dim As String cadenaC = "+-++-" |
|||
Dim As Integer c = deci(cadenaC) |
|||
Print " c:", c, cadenaC |
|||
'calcular en ternario |
|||
Dim As String resS = multTernary(cadenaA, subTernary(cadenaB, cadenaC)) |
|||
Print "a*(b-c):", deci(resS), resS |
|||
Print !"\nComprobamos:" |
|||
Print "a*(b-c): ", a * (b - c) |
|||
Sleep |
|||
</lang> |
|||
{{out}} |
|||
<pre> |
|||
a: 523 +-0++0+ |
|||
b: -436 -++-0-- |
|||
c: 65 +-++- |
|||
a*(b-c): -262023 ----0+--0++0 |
|||
Comprobamos: |
|||
a*(b-c): -262023 |
|||
</pre> |
|||
=={{header|Glagol}}== |
=={{header|Glagol}}== |