我在Visual Basic中有一个严重的编程问题;我想创建一个检查整数是否为素数的程序,并得到以下代码:
Module
Sub Main()
Dim a, j As Integer
Dim prem As Boolean
Console.Write("Veuillez entrez un entier")
a = Console.ReadLine()
For i = 2 To (a - 1)
j = a Mod i
If j = 0 Then
prem = True ' non premier
End If
prem = False
Next
If prem = False Then
Console.WriteLine(a & " est premier")
Else Console.WriteLine(a & "n'est pas premier ")
End If
Console.Read()
End Sub
End Module当我测试时,无论输入什么数字,它总是显示它是质数。
当我删除所有代码来尝试其他东西时,它会返回到似乎有问题的前一个项目。
发布于 2017-07-12 06:41:29
您得到相同答案的原因是,当您找到True时,您会继续运行代码。
If j = 0 Then
prem = True ' non premier
End If该代码会立即被下一行prem = False否定。
如果要在找到true时停止检查,请执行以下操作
If j = 0 Then
prem = True
Exit For
End If由于prem在默认情况下将为False,因此根本不需要在此处设置它。你可以将你的代码减少到
For i = 2 To (a - 1)
j = a Mod i
If j = 0 Then prem = True
Next然后,您只能根据需要设置prem。当您走出循环时,您可以知道如果它仍然是假的,那么它永远不是true,并且如果您仍然需要在到达True时退出,(在翻译您的注释后我对此表示怀疑-我只是为了完整性而包含它),您可以执行以下If j = 0 Then prem = True : Exit For
发布于 2017-07-12 07:00:07
当你检测到你的数字是质数时,你将在下一条语句中设置prem = false。
您也不需要在每个循环中都设置prem = false,因为它已经是false了。
Dim a, j As Integer
Dim prem As Boolean
Console.Write("Veuillez entrez un entier")
a = Console.ReadLine()
Dim i As Integer = 2
While (i < a) AndAlso (prem = false)
prem = (a Mod i) = 0
i += 1
End While
If prem = False Then
Console.WriteLine(a & " est premier")
Else
Console.WriteLine(a & "n'est pas premier ")
End If
Console.Read()您还可以进行其他一些优化。例如,您只需要检查直到Math.Sqrt(a)的因子,因为如果i*y=a和i> Math.Sqrt(a),y必须是< Math.Sqrt(a)。否则,如果i> Math.Sqrt( a )和y> Math.Sqrt(a),那么i*y>a,因为Math.Sqrt(a)* Math.Sqrt(a) =a。
另一个快速优化是你不需要检查每个偶数,你只需要检查1a%2= 01,然后测试奇数。
https://stackoverflow.com/questions/45045197
复制相似问题