2017-07-11 36 views
0

Visual Basicでのプログラミングに深刻な問題があります。番号が入力され、それは常に、それが素数であることを示しているものは何でも、私がテストしたときVisual Studio 2015デバッグ

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 

:私は、整数が素数であると私は、次のコードを取得するかどうかを確認するプログラムを作成したいと思います。

そして、私は何かを試すためにすべてのコードを消去すると、それは問題があるように思われる以前のプロジェクトに戻ります。

答えて

0

同じ答えを得る理由は、Trueが見つかったときにコードを実行し続けるためです。

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

このコードは、すぐ次の行prem = Falseによって否定されます。

あなたが本当のを見つけたときにチェックを停止したい場合は、プレムはデフォルトでFalseになりますよう、次の

​​

が見てやる、全くそれをここで設定する必要はありません。コードを小さくすることができます

For i = 2 To (a - 1) 
    j = a Mod i 
    If j = 0 Then prem = True 
Next 

必要に応じて、プレミアを設定することができます。あなたがループから抜け出すと、それがまだFalseであっても真ではないことが分かります。そして、あなたが真実になるときにまだ終了する必要がある場合(私はあなたのコメントを翻訳した後で疑問に思っています。 If j = 0 Then prem = True : Exit For

0

AS @ファビュラスは、あなたの番号が素数であることを検出すると、prem = falseを次の声明に設定しています。

すでに偽であるため、ループごとにprem = 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() 

その他の最適化もいくつかあります。たとえば、i * y = aおよびi> Math.Sqrt(a)の場合、yは< Math.Sqrt(a)でなければならないため、Math.Sqrt(a)までの要素をチェックするだけで済みます。そうでなければ、i> Math.Sqrt(a)とy> Math.Sqrt(a)の場合、i * y> aであるから、Math.Sqrt(a)* Math.Sqrt(a)= a。

もう1つの迅速な最適化では、すべての偶数をチェックする必要はないので、1a%2 = 01をチェックして奇数をテストするだけです。

関連する問題