📄 form1.frm
字号:
VERSION 5.00
Begin VB.Form Form1
Caption = "Form1"
ClientHeight = 3195
ClientLeft = 60
ClientTop = 345
ClientWidth = 4680
LinkTopic = "Form1"
ScaleHeight = 3195
ScaleWidth = 4680
StartUpPosition = 3 '窗口缺省
Begin VB.TextBox OutputBox
Height = 495
Left = 360
TabIndex = 3
Top = 840
Width = 3615
End
Begin VB.TextBox TextBox_LengthOfNumbers
Height = 495
Left = 1920
TabIndex = 2
Text = "50"
Top = 240
Width = 735
End
Begin VB.CommandButton CalculateButton
Caption = "开始"
Height = 495
Left = 720
TabIndex = 1
Top = 1800
Width = 1215
End
Begin VB.CommandButton Command1
Caption = "停止"
Height = 495
Left = 2280
TabIndex = 0
Top = 1800
Width = 1215
End
End
Attribute VB_Name = "Form1"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
Dim CalculatingPi As Integer
Sub CalculateButton_Click()
If CalculatingPi = False Then
CalculatePi
Else
End
End If
End Sub
Sub CalculatePi()
Dim TimeSpent As Double
TimeSpent = Timer
OutputBox = "Initializing": DoEvents
CalculatingPi = True
' CalculateButton.Caption = "Stop!"
Dim X As Integer
Dim CarryPosition As Integer
Dim NumberOfLoops As Integer
Dim LengthOfNumbers As Integer
LengthOfNumbers = TextBox_LengthOfNumbers + 3
NumberOfLoops = Int(2 / 3 * LengthOfNumbers)
ReDim ArcTangent5(1 To LengthOfNumbers) As String * 1
ReDim ArcTangent239(1 To LengthOfNumbers) As String * 1
ReDim MultipliedArcTangent5(1 To LengthOfNumbers + 1) As String * 1
ReDim MultipliedArcTangent239(1 To LengthOfNumbers + 1) As String * 1
OutputBox = "Calculating ArcTangent of 1/5": DoEvents
FindArcTangent 5, NumberOfLoops, LengthOfNumbers, ArcTangent5()
OutputBox = "Calculating the ArcTangent of 1/239": DoEvents
FindArcTangent 239, NumberOfLoops, LengthOfNumbers, ArcTangent239()
OutputBox = "Multiplying ArcTan of 1/5 by 16": DoEvents
MultiplyArray ArcTangent5(), 16, MultipliedArcTangent5()
OutputBox = "Multiplying ArcTan of 1/239 by 4": DoEvents
MultiplyArray ArcTangent239(), 4, MultipliedArcTangent239()
OutputBox = "Subtracting the Multiplied Arctangents": DoEvents
For X = LengthOfNumbers To 1 Step -1
If MultipliedArcTangent5(X) < MultipliedArcTangent239(X) Then
CarryPosition = X - 1
Do Until MultipliedArcTangent5(CarryPosition) <> "0"
MultipliedArcTangent5(CarryPosition) = "9"
CarryPosition = CarryPosition - 1
Loop
MultipliedArcTangent5(CarryPosition) = CStr(CInt(MultipliedArcTangent5(CarryPosition)) - 1)
MultipliedArcTangent5(X) = CStr((CInt(MultipliedArcTangent5(X)) + 10) - CInt(MultipliedArcTangent239(X)))
Else
MultipliedArcTangent5(X) = CStr(CInt(MultipliedArcTangent5(X)) - CInt(MultipliedArcTangent239(X)))
End If
DoEvents
Next X
Dim PiValue As String
OutputBox = ""
For X = 1 To LengthOfNumbers - 3
PiValue = PiValue & MultipliedArcTangent5(X)
If X Mod 5 = 0 Then
PiValue = PiValue & " "
End If
Next X
OutputBox = PiValue
MsgBox "Pi calculated to " & LengthOfNumbers - 3 & " decimal places." & Chr$(13) & "Completed " & NumberOfLoops & " iterations." & Chr$(13) & "Spent " & (Timer - TimeSpent) / 60 & " minutes calculating.", 64, "Calculations Complete"
CalculatingPi = False
End Sub
Sub FindArcTangent(ArcTanToFind As Integer, NumberOfLoops As Integer, LengthOfNumbers As Integer, ArcTangent() As String * 1)
Dim StartPos As Integer
Dim Sum As Long
Dim X As Integer
Dim Divisor As Long
Dim Remainder As Long
Dim CarryPosition As Long
Dim DividedInto As Integer
ReDim Answer(1 To LengthOfNumbers) As String * 1
ReDim Divided(1 To LengthOfNumbers) As String * 1
StartPos = 1
For X = 1 To LengthOfNumbers
ArcTangent(X) = "0"
Divided(X) = "0"
Answer(X) = "0"
Next X
Select Case ArcTanToFind
Case 5
ArcTangent(1) = "2"
Case 239
X = 1
FillInNumbers:
If X <= LengthOfNumbers Then ArcTangent(X) = "0": X = X + 1
If X <= LengthOfNumbers Then ArcTangent(X) = "0": X = X + 1
If X <= LengthOfNumbers Then ArcTangent(X) = "4": X = X + 1
If X <= LengthOfNumbers Then ArcTangent(X) = "1": X = X + 1
If X <= LengthOfNumbers Then ArcTangent(X) = "8": X = X + 1
If X <= LengthOfNumbers Then ArcTangent(X) = "4": X = X + 1
If X <= LengthOfNumbers Then ArcTangent(X) = "1": X = X + 1
If X <= LengthOfNumbers Then GoTo FillInNumbers
End Select
For X = 1 To LengthOfNumbers
Answer(X) = ArcTangent(X)
Next X
Divisor = 3
Do Until (Divisor - 1) / 2 = NumberOfLoops + 1
For X = Int(StartPos) To LengthOfNumbers
Remainder = Remainder * 10
Remainder = Remainder + CInt(Answer(X))
Do Until Remainder < (ArcTanToFind ^ 2)
Remainder = Remainder - (ArcTanToFind ^ 2)
DividedInto = DividedInto + 1
Loop
Answer(X) = CStr(DividedInto)
Divided(X) = Answer(X)
DividedInto = 0
DoEvents
Next X
DoneDividing = 0
Remainder = 0
DividedInto = 0
For X = Int(StartPos) To LengthOfNumbers
Remainder = Remainder * 10
Remainder = Remainder + CInt(Divided(X))
Do Until Remainder < Divisor
Remainder = Remainder - Divisor
DividedInto = DividedInto + 1
Loop
Divided(X) = CStr(DividedInto)
DividedInto = 0
DoEvents
Next X
Remainder = 0
DividedInto = 0
If Divisor Mod 4 = 1 Then
For X = LengthOfNumbers To 1 Step -1
Sum = Sum + CInt(Divided(X)) + CInt(ArcTangent(X))
ArcTangent(X) = CStr(Sum Mod 10)
Sum = Int(Sum / 10)
DoEvents
Next X
Sum = 0
Else
For X = LengthOfNumbers To 1 Step -1
If ArcTangent(X) < Divided(X) Then
CarryPosition = X - 1
Do Until ArcTangent(CarryPosition) <> "0"
ArcTangent(CarryPosition) = "9"
CarryPosition = CarryPosition - 1
Loop
ArcTangent(CarryPosition) = CStr(CInt(ArcTangent(CarryPosition)) - 1)
ArcTangent(X) = CStr((CInt(ArcTangent(X)) + 10) - CInt(Divided(X)))
Else
ArcTangent(X) = CStr(CInt(ArcTangent(X)) - CInt(Divided(X)))
End If
DoEvents
Next X
CarryPosition = 0
End If
Divisor = Divisor + 2
OutputBox = "Calculating ArcTangent of 1/" & ArcTanToFind & ", Done with iteration " & (Divisor - 1) / 2
DoEvents
StartPos = StartPos + 1.25
Loop
End Sub
Sub MultiplyArray(ArrayToMultiply() As String * 1, NumberToMultiplyBy As Integer, Answer() As String * 1)
Dim Position As Integer
Dim SmallAnswer As Integer
Dim NumberToCarry As Integer
For Position = TextBox_LengthOfNumbers + 3 To 1 Step -1
SmallAnswer = (CInt(ArrayToMultiply(Position)) * NumberToMultiplyBy) + NumberToCarry
Answer(Position) = Right$(CStr(SmallAnswer), 1)
If SmallAnswer < 10 Then
NumberToCarry = 0
Else
NumberToCarry = CInt(Left$(CStr(SmallAnswer), CInt(Len(CStr(SmallAnswer))) - 1))
End If
DoEvents
Next Position
End Sub
Private Sub Command1_Click()
CalculatePi
End Sub
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -