96 lines
2.1 KiB
Plaintext
96 lines
2.1 KiB
Plaintext
' version 08-01-2017
|
|
' compile with: fbc -s console
|
|
|
|
Const As UInteger base_ = 1000000000 ' base 1,000,000,000
|
|
|
|
Function multiply(a1 As String, b1 As String) As String
|
|
|
|
Dim As String a = a1, b = b1
|
|
|
|
Trim(a) : Trim(b) ' remove spaces
|
|
If Len(a) = 0 Or Len(b) = 0 Then Return "0"
|
|
|
|
If Len(a) + Len(b) > 10000 Then
|
|
Print "number(s) are to big"
|
|
Sleep 5000,1
|
|
Return ""
|
|
End If
|
|
|
|
If Len(a) < Len(b) Then
|
|
Swap a, b
|
|
End If
|
|
|
|
Dim As ULongInt product
|
|
Dim As UInteger carry, i, m, shift
|
|
Dim As UInteger la = Len(a), lb = Len(b)
|
|
Dim As UInteger la9 = la \ 9 + IIf((la Mod 9) = 0, 0, 1)
|
|
Dim As UInteger lb9 = lb \ 9 + IIf((lb Mod 9) = 0, 0, 1)
|
|
Dim As UInteger arr_a(la9), answer((la9 + lb9) + 2)
|
|
Dim As Integer last = la9
|
|
|
|
' make length a, b a multipy of 9
|
|
a = Right((String(9, "0") + a), la9 * 9)
|
|
b = Right((String(9, "0") + b), lb9 * 9)
|
|
|
|
For i = 1 To la9
|
|
arr_a(la9 - i +1) = Val(Mid(a, i * 9 -8, 9))
|
|
Next
|
|
|
|
Do
|
|
carry = 0
|
|
m = Val(Mid(b, lb9 * 9 -8, 9))
|
|
For i = 1 To la9
|
|
product = CULngInt(arr_a(i)) * m + answer(i + shift) + carry
|
|
carry = product \ base_
|
|
answer(i + shift) = product - carry * base_
|
|
Next
|
|
If carry <> 0 Then
|
|
last = la9 + shift +1
|
|
answer(last) = carry
|
|
End If
|
|
lb9 = lb9 -1
|
|
shift = shift +1
|
|
Loop Until lb9 = 0
|
|
|
|
Dim As String tmp = Str(answer(last))
|
|
last = last -1
|
|
While last > 0
|
|
tmp = tmp + Right(String(9,"0") + Str(answer(last)), 9)
|
|
last = last -1
|
|
Wend
|
|
|
|
Return tmp
|
|
|
|
End Function
|
|
|
|
' ------=< MAIN >=------
|
|
|
|
Dim As String a = "2", b = "2", answer
|
|
Dim As UInteger i = 1, j
|
|
|
|
For j = 1 To 7
|
|
answer = multiply(a, b)
|
|
a = answer
|
|
b = answer
|
|
i = i + i
|
|
Print using "2 ^ ### = "; i;
|
|
Print answer
|
|
Next
|
|
|
|
Print
|
|
Print "-------------------------------------------------"
|
|
Print
|
|
|
|
a = "2" : b = "1" : answer = ""
|
|
For j = 1 To 128
|
|
answer = multiply(a, b)
|
|
b = answer
|
|
Next
|
|
Print "2 ^ 128 = "; answer
|
|
|
|
' empty keyboard buffer
|
|
While InKey <> "" : Wend
|
|
Print : Print "hit any key to end program"
|
|
Sleep
|
|
End
|