Imports System
Imports System.Linq
'/* Multiply Two Long Numbers
' ------------------------------------
' Implements manual big‑integer multiplication
' using decimal strings.
'*/
Imports System.Text
Public Class LongNumber
Private ReadOnly _value As String
Public Sub New(ByVal v As String)
_value = Normalize(v)
End Sub
Public ReadOnly Property Value As String
Get
Return _value
End Get
End Property
'/* Multiply two integer strings a * b and return the result as a string.
' Caller receives a normal VB.NET String.
' No aliasing issues because Strings are immutable. */
Public Function Multiply(ByVal other As LongNumber) As LongNumber
Dim a As String = Me._value
Dim b As String = other._value
' Handle sign
Dim sign As Boolean = False
If a.StartsWith("-"c) Then
sign = Not sign
a = a.Substring(1)
End If
If b.StartsWith("-"c) Then
sign = Not sign
b = b.Substring(1)
End If
' If either is "0", return "0"
If a = "0" OrElse b = "0" Then
Return New LongNumber("0")
End If
Dim la As Integer = a.Length
Dim lb As Integer = b.Length
Dim digits(la + lb - 1) As Integer
'/* Multiply from right to left */
For i As Integer = la - 1 To 0 Step -1
Dim ca As Char = a(i)
If Not Char.IsDigit(ca) Then Continue For
For j As Integer = lb - 1 To 0 Step -1
Dim cb As Char = b(j)
If Not Char.IsDigit(cb) Then Continue For
Dim pos As Integer = i + j + 1
Dim sum As Integer = digits(pos) + (Convert.ToInt32(ca) - Convert.ToInt32("0"c)) * (Convert.ToInt32(cb) - Convert.ToInt32("0"c))
digits(pos) = sum Mod 10
digits(pos - 1) += sum \ 10
Next
Next
' Convert digits() to string, skipping leading zero
Dim sb As New StringBuilder()
Dim start As Integer = If(digits(0) = 0, 1, 0)
For i As Integer = start To digits.Length - 1
sb.Append(Convert.ToChar(digits(i) + Convert.ToInt32("0"c)))
Next
' Add sign if needed
If sign Then
sb.Insert(0, "-"c)
End If
Return New LongNumber(sb.ToString())
End Function
Private Shared Function Normalize(ByVal s As String) As String
' Skip leading spaces
s = s.TrimStart()
' Remove leading zeros (but leave one zero)
Dim i As Integer = 0
While i < s.Length - 1 AndAlso s(i) = "0"c
i += 1
End While
Return s.Substring(i)
End Function
Public Overrides Function ToString() As String
Return _value
End Function
End Class
' Demo program
Module Program
Sub Main()
Dim a As New LongNumber(" 18361891827367132321")
Dim b As New LongNumber("-18361891827367132321")
Dim result As LongNumber = a.Multiply(b)
Console.WriteLine(result)
End Sub
End Module
' run:
'
' -337159071479931885857929667075122847041
'