Microsoft 製品に組み込まれている Visual Basic の実装。
データ変換関数のCLngLngやCLngを使って型変換しましょう
Option Explicit
Const Ketasuu = 200 '10進数の桁数
Const Ncnt = Ketasuu \ 8 '1億進数の桁数
Const BASE As Long = 100000000
'1億進数(10進数8桁)整数のデータ型
Public Type Lng
Pm As Byte '0:正数、1:負数
Dt(0 To Ncnt) As Long '1億進数の配列,Dt(0)はデータ数
End Type
'多倍長整数_積算
Private Function LngMul(x As Lng, y As Lng) As Lng
Dim a As Lng
Dim b As LongLong
Dim c As LongLong
Dim d As LongLong
Dim i As Integer
Dim j As Integer
Dim k As Integer
For i% = 1 To CInt(y.Dt(0)): For j% = 1 To CInt(x.Dt(0))
k = i% + j%
b^ = CLngLng(x.Dt(j%)) * CLngLng(y.Dt(i%)) 'Long * Long -> LongLong
c^ = b^ \ BASE: 'cc& = c^
d^ = b^ Mod BASE: 'dd& = d^
a.Dt(k - 1) = CLng(CLngLng(a.Dt(k - 1)) + d^)
a.Dt(k) = CLng(CLngLng(a.Dt(k)) + c^)
Next j%, i%
a.Pm = IIf(x.Pm <> y.Pm, 1, 0)
For i = 1 To Ncnt
If a.Dt(i) > BASE Then
a.Dt(i + 1) = a.Dt(i + 1) + (a.Dt(i) \ BASE)
a.Dt(i) = a.Dt(i) Mod BASE
End If
Next
For i = Ncnt To 1 Step -1
If a.Dt(i) <> 0 Then
a.Dt(0) = i
Exit For
End If
Next
LngMul = a
End Function
Sub test()
Dim x As Lng
Dim y As Lng
Dim z As Lng
Dim i
x.Dt(0) = 10
For i = 1 To 10
x.Dt(0) = i
y.Dt(0) = i
x.Dt(i) = Rnd * BASE
y.Dt(i) = Rnd * BASE
Next
z = LngMul(x, y)
End Sub