标题:简单vb 求助大佬
只看楼主
林夕i静
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2020-5-8
结帖率:0
已结贴  问题点数:20 回复次数:7 
简单vb 求助大佬

判断一个数是否为素数。并显示相应提示。如:该数为素数时,显示"素数";该数为非素数时,显示"非素数"。要求使用For语句来实现,用布尔型变量flag作为该数是否为素数的标志,注意:不得使用Goto语句.
搜索更多相关主题的帖子: 素数 是否为 语句 显示 vb 
2020-05-08 09:31
ZHRXJR
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:125
帖 子:1034
专家分:5519
注 册:2016-5-10
得分:7 
程序代码:
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编辑过]


请不要选我!!!
2020-05-08 10:26
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
得分:7 
回复 2楼 ZHRXJR
一点算法都不讲?这个算法要你得到几个2000000000范围内最大的素数大概要十几秒。
最不济到XX/2循环效率也高些嘛,再高点就到sqrt(XX),还高点就判断XX mod 6是不是等于5或1、step 6.

能编个毛线衣吗?
2020-05-08 11:22
ysr2857
Rank: 6Rank: 6
等 级:贵宾
威 望:28
帖 子:767
专家分:65
注 册:2020-2-10
得分:7 
回复 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编辑过]

2020-05-08 19:55
ysr2857
Rank: 6Rank: 6
等 级:贵宾
威 望:28
帖 子:767
专家分:65
注 册:2020-2-10
得分:0 
1999999973/6=333333328余数5,用我的程序验证的确也是素数。

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

2020-05-08 20:09
ysr2857
Rank: 6Rank: 6
等 级:贵宾
威 望:28
帖 子:767
专家分:65
注 册:2020-2-10
得分:0 
这个程序超过20亿就溢出了,的确只能判断20亿以内的数,必须是正整数。
2020-05-08 21:15
ZHRXJR
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:125
帖 子:1034
专家分:5519
注 册:2016-5-10
得分:0 
谢谢楼上朋友们的讨论,我的回答仅仅是按楼主的要求做的,没有考虑运行时间问题。测试了一下 1999999973 检测大概用了10 秒左右。
如果将数据类型改成整形数据,检测范围可能小于32000,运行时间也就不到一秒钟。


请不要选我!!!
2020-05-09 08:30
ysr2857
Rank: 6Rank: 6
等 级:贵宾
威 望:28
帖 子:767
专家分:65
注 册:2020-2-10
得分:0 
回复 7楼 ZHRXJR
额,对了,谢谢老师!欢迎指点和讨论!
2020-05-09 15:59



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-501484-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.202845 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved