Sub MaxInt(N1 As Int, N2 As Int) As Int
If N1 > N2 Then
Return N1
Else
Return N2
End If
End Sub
Sub GetDigitAt(S As String, I As Int) As Int
Dim LastChar As Int = S.Length - 1
If I > LastChar Then Return 0
Return Asc(S.CharAt(I)) - 48
End Sub
Sub GetDigitAtReverse(S As String, I As Int) As Int
Dim LastChar As Int = S.Length - 1
If I > LastChar Then Return 0
Return Asc(S.CharAt(LastChar - I)) - 48
End Sub
Sub AddStrings(N1 As String, N2 As String) As String
Dim Result As String
Dim Carry As Int
For I = 0 To MaxInt(N1.Length, N2.Length) - 1
Dim Sum As Int = GetDigitAtReverse(N1, I) + GetDigitAtReverse(N2, I) + Carry
Carry = 0
Do While Sum > 9
Sum = Sum - 10
Carry = Carry + 1
Loop
Result = Sum & Result
Next
If Carry <> 0 Then
Result = Carry & Result
End If
Return Result
End Sub
Sub RemoveLeadingZeroes(N As String) As String
Do While N.Length > 1
If N.CharAt(0) <> "0" Then Exit
N = N.SubString(1)
Loop
Return N
End Sub
Sub ShiftRightString(N As String) As String
Dim Result As String
Dim Carry As Int
For I = 0 To N.Length - 1
Dim Temp As Int = Carry * 10 + GetDigitAt(N, I)
Carry = Bit.And(Temp, 1)
Result = Result & Bit.ShiftRight(Temp, 1)
Next
Return RemoveLeadingZeroes(Result)
End Sub
Sub MultiplyStrings(N1 As String, N2 As String) As String
Dim ResultSize As Int = N1.Length + N2.Length
Dim P(ResultSize) As Int
For I1 = 0 To N1.Length - 1
Dim D1 As Int = GetDigitAtReverse(N1, I1)
For I2 = 0 To N2.Length - 1
Dim D2 As Int = GetDigitAtReverse(N2, I2)
P(I1 + I2) = P(I1 + I2) + D1 * D2
Next
For I = 0 To ResultSize - 2
Do While P(I) > 9
P(I) = P(I) - 10
P(I + 1) = P(I + 1) + 1
Loop
Next
Next
Dim Result As String
For I = 0 To ResultSize - 1
Result = P(I) & Result
Next
Return RemoveLeadingZeroes(Result)
End Sub
Sub MultiplyStrings2(N1() As String, N2() As String) As String()
Dim Result(2) As String
Result(0) = MultiplyStrings(N1(0), N2(0))
Result(1) = AddStrings(N1(1), N2(1))
Return Result
End Sub
Sub Commas(N As String) As String
For I = N.Length - 3 To 1 Step -3
N = N.SubString2(0, I) & "," & N.SubString(I)
Next
Return N
End Sub
Sub RandomNumber(L As Int) As String
Dim Result As String = Rnd(1, 10)
For I = 2 To L
Result = Result & Rnd(0, 10)
Next
Return Result
End Sub
Sub LimitString(N As String, L As Int) As String
If L > 0 Then
If N.Length > L Then
N = N.SubString2(0, L + 1)
N = AddStrings(N, "5")
N = N.SubString2(0, L)
End If
End If
Return N
End Sub
Sub LimitString2(N() As String, L As Int) As String()
If L > 0 Then
If N(0).Length > L Then
Dim NumDigitsToRemove As Int = N(0).Length - L
N(0) = LimitString(N(0), L)
N(1) = AddStrings(N(1), NumDigitsToRemove.As(String))
End If
End If
Return N
End Sub
Sub PowerStrings(Base As String, Exponent As String, LimitLength As Int) As String()
Dim GuardLength As Int = 16
Dim Result() As String = Array As String("1", "0")
Dim Term() As String = Array As String(Base, "0")
Do While Exponent <> "0"
If Bit.And(GetDigitAtReverse(Exponent, 0), 1) <> 0 Then
Result = MultiplyStrings2(Result, Term)
Result = LimitString2(Result, LimitLength + GuardLength)
End If
Exponent = ShiftRightString(Exponent)
If Exponent = "0" Then Exit
Term = MultiplyStrings2(Term, Term)
Term = LimitString2(Term, LimitLength + GuardLength)
Loop
Return LimitString2(Result, LimitLength)
End Sub
Sub ScientificFormat(N() As String) As String
If N(1) = "0" Then Return Commas(N(0))
Dim Mantissa As String = N(0)
Dim Exponent As String = N(1)
If Mantissa.Length > 1 Then
Dim NumDigitsAfterPoint As String = Mantissa.Length - 1
Exponent = AddStrings(Exponent, NumDigitsAfterPoint)
Mantissa = Mantissa.CharAt(0) & "." & Mantissa.SubString(1)
End If
Return Mantissa & "E+" & Exponent
End Sub