繁体   English   中英

Visual Studio 2015调试

[英]Visual Studio 2015 debugging

我在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

当我测试时,无论输入什么数字,它始终表明它是质数。

当我删除所有代码以尝试其他方法时,它可以返回到似乎有问题的上一个项目。

得到相同答案的原因是,当找到True时,您将继续运行代码。

If j = 0 Then
    prem = True ' non premier
End If

下一行prem = False立即使该代码无效。

如果要在找到真值时停止检查,请执行以下操作

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

然后只能根据需要设置权限。 当您跳出循环时,您可以知道它仍然为False,并且如果您仍然需要在达到true时退出,那么它就永远不会为True(在翻译您的评论后,我对此表示怀疑-我只是将其包括在内为了完整性),您可以执行以下操作: If j = 0 Then prem = True : Exit For

AS @Fabulous指出,一旦您检测到数字为质数,就在下一条语句中设置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然后测试奇数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM