-2

これが私のコードのスニペットです。基本的に、ボタンがクリックされると、このロジックが起動し、数値が素数かどうかを判断する必要があります。問題は、実際には素数であるにもかかわらず、一部の数値が「素数ではない」として返されることです。誰でも欠陥がどこにあるか指摘できますか?

ありがとうございました

    private void bntTestPrime_Click(object sender, EventArgs e)
    {
        int num;
        double num_sqrt;
        int num_fl;

        num = Convert.ToInt32(txtInput.Text);

        num_sqrt = Math.Sqrt(num);

        num_fl = Convert.ToInt32(Math.Floor(num_sqrt));

        for (int i = 1; i <= num_fl; i++)
        {
            if (num % i == 0 && i != num)
                lblResult_prime.Text = "Number " + num + " is not Prime.";
            else
                lblResult_prime.Text = "Number " + num + " is Prime.";
        }

    }
4

6 に答える 6

1

1 はすべての数の約数なので、チェックしないでください。2 から開始します。また、既に 2 から までループしているため、 が と等しくなるsqrt(num)方法はありません。inum

于 2013-07-27T06:45:30.453 に答える
1

条件を使用して最初の 4 つの素数をチェックし、11 でループを開始して 2 ずつインクリメントすることで、大きな数をチェックする際のパフォーマンス ヒットを減らすことができます。

    private bool IsPrime(int num)
    {
        double num_sqrt = Math.Sqrt(num);
        int num_fl = Convert.ToInt32(Math.Floor(num_sqrt));
        if (num !=1 && num !=2 && num != 3 && num != 5 && num != 7 && num % 2 > 0 _
            && num % 3 > 0 && num % 5 > 0 && num % 7 > 0)
        {
            for (int i = 11; i <= num_fl; i+=2)
            {
                if (num % i == 0)
                {
                    return false;
                }
            }
        }
        else
            return false;
        return true;
    }

チェックしたい上限をカバーするのに十分な大きさの素数のリストを使用することで、コードを短縮し、パフォーマンスを大幅に向上させることができます。次に、Contains メソッドを使用して素数をテストします。

于 2013-07-27T08:07:14.110 に答える
1

Blenderの答えに追加するには、繰り返しループごとに出力テキストを設定しているだけであることを指摘したいと思います。つまり、結果は最後にチェックした数値にのみ依存します。あなたがする必要があるのは、数が素数であると仮定して、除数が見つかるまでループすることです。除数が見つかった場合。約数が見つからない場合にのみ、その数は素数です。最終的に、コードは次のようになります。

private bool IsPrime(int num)
{
    double num_sqrt = Math.Sqrt(num);
    int num_fl = Convert.ToInt32(Math.Floor(num_sqrt));

    for (int i = 2; i <= num_fl; i++)
    {
        if (num % i == 0)
        {
            return false;
       }
    }
    return true;
}

private void bntTestPrime_Click(object sender, EventArgs e)
{
    int num = Convert.ToInt32(txtInput.Text);
    bool isPrime = IsPrime(num);
    if (isPrime)
        lblResult_prime.Text = "Number " + num + " is Prime.";
    else
        lblResult_prime.Text = "Number " + num + " is not Prime.";
}
于 2013-07-27T06:52:47.333 に答える
0

以下のコードを試してください。

bool IsPrime(int number) {

   if(number%2==0 && number!=2) return false; //no need to check for even numbers
   for (int i = 2; i < number; i++) {


     if (number % i == 0 && i != number) return false;
   }
   return true;
}
于 2013-07-27T06:52:23.387 に答える