注册 登录
编程论坛 VB6论坛

简单vb 求助大佬

林夕i静 发布于 2020-05-08 09:31, 2267 次点击

判断一个数是否为素数。并显示相应提示。如:该数为素数时,显示"素数";该数为非素数时,显示"非素数"。要求使用For语句来实现,用布尔型变量flag作为该数是否为素数的标志,注意:不得使用Goto语句.
7 回复
#2
ZHRXJR2020-05-08 10:26
程序代码:

Private Sub Command1_Click()
If CLng(Text1.Text) <= 2 Then
    MsgBox "判断数必须是大于2 ,并且是整数!", 16, "错误提示!"
    Exit Sub
End If
Dim XX As Long, I As Long, J As Long, AA As Boolean
AA = False
XX = CLng(Text1.Text)
For I = 2 To XX - 1
    If XX Mod I = 0 Then
        AA = True
        Exit For
    End If
Next I
If AA = True Then
    Text2.Text = "判断数:" & XX & " 不是素数!"
ElseIf AA = False Then
    Text2.Text = "判断数:" & XX & " 是素数!"
End If
End Sub

可以判断2000000000以内的正整数。
只有本站会员才能查看附件,请 登录


[此贴子已经被作者于2020-5-8 10:34编辑过]

#3
wmf20142020-05-08 11:22
回复 2楼 ZHRXJR
一点算法都不讲?这个算法要你得到几个2000000000范围内最大的素数大概要十几秒。
最不济到XX/2循环效率也高些嘛,再高点就到sqrt(XX),还高点就判断XX mod 6是不是等于5或1、step 6.
#4
ysr28572020-05-08 19:55
回复 3楼 wmf2014
这样对合数是快的,如1999999999是合数,但对素数的确很慢,如1999999973是素数,很慢,没有计算时间感觉很慢!用我的分解程序就比较快,1999999999=31*64516129。
我的程序:
Private Function fenjieyinzi(sa As String) As String
Dim x, a, b, k As String
a = Val(sa)

x = 3
If a <= 1 Or a > Int(a) Then
 If a = 1 Then
 fenjieyinzi = "它既不是质数,也不是合数"
 
 Else
 MsgBox "error"
 End If
  
Else

 Do While a / 2 = Int(a / 2) And a >= 4
  
 If b = 0 Then
 fenjieyinzi = fenjieyinzi & "2"
 b = 1
 Else
 fenjieyinzi = fenjieyinzi & "*2"
 End If
 a = a / 2
 k = a
  
 Loop

 Do While a > 1
 Do While x <= Sqr(a)
 Do While a / x = Int(a / x) And a >= x * x
  
 If b = 0 Then
 fenjieyinzi = fenjieyinzi & x
 b = 1
 Else
 fenjieyinzi = fenjieyinzi & "*" & x
 End If
 a = a / x
 Loop
  
 x = x + 2
 Loop
  
 k = a
 a = 1
 Loop
  
 If b = 1 Then
 fenjieyinzi = fenjieyinzi & "*" & k
 Else
 fenjieyinzi = "这是一个质数"
 End If
  
  
  
  
 
End If

End Function

Private Sub Command1_Click()
Dim a As Long
a = Trim(Text1)
Text2 = fenjieyinzi(Trim(a))
End Sub

用你的方法的确也是快,试用你的法改变为如下程序:(运行结果:判断数:1999999973 是素数!)
Private Sub Command1_Click()

If CLng(Text1.Text) <= 2 Then
    MsgBox "判断数必须是大于2 ,并且是整数!", 16, "错误提示!"
    Exit Sub
End If
Dim XX As Long, I As Long, J As Long, AA As Boolean
AA = False
XX = CLng(Text1.Text)
If Right(XX, 1) Mod 2 = 0 Then
Text2.Text = "判断数:" & XX & " 不是素数!"
ElseIf XX = 3 Then
Text2.Text = "判断数:" & XX & " 是素数!"
ElseIf XX Mod 6 = 5 Then
For I = 5 To Sqr(XX) Step 2
    If XX Mod I = 0 Then
        AA = True
        Exit For
    End If
Next I
If AA = True Then
    Text2.Text = "判断数:" & XX & " 不是素数!"
ElseIf AA = False Then
    Text2.Text = "判断数:" & XX & " 是素数!"
End If
ElseIf XX Mod 6 = 1 Then
For I = 5 To Sqr(XX) Step 2
    If XX Mod I = 0 Then
        AA = True
        Exit For
    End If
Next I
If AA = True Then
    Text2.Text = "判断数:" & XX & " 不是素数!"
ElseIf AA = False Then
    Text2.Text = "判断数:" & XX & " 是素数!"
End If
Else
Text2.Text = "判断数:" & XX & " 不是素数!"
End If
End Sub


[此贴子已经被作者于2020-5-8 20:32编辑过]

#5
ysr28572020-05-08 20:09
1999999973/6=333333328余数5,用我的程序验证的确也是素数。

[此贴子已经被作者于2020-5-8 20:11编辑过]

#6
ysr28572020-05-08 21:15
这个程序超过20亿就溢出了,的确只能判断20亿以内的数,必须是正整数。
#7
ZHRXJR2020-05-09 08:30
谢谢楼上朋友们的讨论,我的回答仅仅是按楼主的要求做的,没有考虑运行时间问题。测试了一下 1999999973 检测大概用了10 秒左右。
如果将数据类型改成整形数据,检测范围可能小于32000,运行时间也就不到一秒钟。

#8
ysr28572020-05-09 15:59
回复 7楼 ZHRXJR
额,对了,谢谢老师!欢迎指点和讨论!
1