-7

このコードが機能しないのはなぜですか?すべての素数が10になるはずですが、代わりに2と3の数字しか得られません。

bool m = true;
int i;
int a;
for (a = 2; a <= 10; a++)
{
    for (i = 2; i < a; i++) 
    {
        if (a % i == 0)
        {
            m = false;
        }
    }

    if (m == true)
    {
        Console.WriteLine(a);
    }
}
Console.ReadKey();
4

4 に答える 4

3

2つの主要な問題。

  1. リセットすることは決してないmので、プライム以外のものを見つけたら、残りの反復でその結果に固執します。
  2. 非プライムをテストしているときは、見つけたものを1つ続けて、結果を上書きします。あなたがそれを書いた方法のために、それi-1 % iは決してそうなることのないほど大きな問題ではありませんが== 0、あなたが早く勃発したならばあなたはあなた自身を多くの時間を節約することができます。Math.Sqrt(a)(それ以降はすべての適格な除数がすでにテストされているため、最大でテストすることで時間を大幅に節約することもできます(a / i = b同じa / b = iで、そのうちの1つだけをチェックする必要があります))
于 2013-03-25T22:24:28.683 に答える
1
for (a = 2; a <= 10; a++)
{
    for (i = 2; i < a; i++)
    {
        if (a % i == 0)
        {
            m = false;
        }
    }

    if (m == true)
    {
        Console.WriteLine(a);
    }

    m = true; //<<******* Add this line
}

もちろん、ある程度のスピードアップは常に可能です

for (a = 2; a <= 100; a++)
{
    for (i = 2; i < Math.Sqrt(a); i++) //<--- http://en.wikipedia.org/wiki/Prime_number#Trial_division
    {
        if (a % i == 0)
        {
            m = false;
            break; //<---- a is not prime, quit the inner loop immediately.
        }
    }

    if (m == true)
    {
        Console.WriteLine(a);
    }

    m = true; //<<******* Add this line
}
于 2013-03-25T22:24:15.873 に答える
0

m非プライムを通過した後はリセットされません。

于 2013-03-25T22:23:03.583 に答える
-1

本当にブール変数が必要ですか?値を出力するだけの場合は、ブール値をスキップできます。

int i;
int a;
for(a=2; a<=10; a++) {
    for(i=2; i<a; i++) {
        if(a % i == 0) {
            Console.WriteLine(a);
            break;
        }
    }
}

break強制的に内部の出口が出ることに注意してください。forこれにより、外部の次の反復に進むことができますfor


修正:上記のコードは非素数を出力します。そうです、素数を追跡するためにブール変数が必要になる場合があります。しかし、それを適切に機能させたい場合は、内部を壊す必要があります。

int i;
int a;
bool m;
for(a=2; a<=10; a++) {
    m = true
    for(i=2; i<a; i++) {
        if(a % i == 0) {
            m = false;
            break;
        }
    }
    if (m) {
        Console.WriteLine(a);
    }
}

もちろん、ブール変数がなくても同じ結果を得ることができます。休憩後に別の比較を実行するだけです。

int i;
int a;
for(a=2; a<=10; a++) {
    for(i=2; i<a; i++) {
        if(a % i == 0) {
            break;
        }
    }
    if(a % i != 0) {
        Console.WriteLine(a);
    }
}
于 2013-03-25T22:29:56.857 に答える