-1

すべての素数を順番に出力しようとしていますが、最終的なコードは次のとおりです。すべての素数を出力する代わりに、乱数を出力します。素数とそうでないものがあります:/なぜそうなのですか?

#include <iostream>

using namespace std;

long int x,y=3;
int a=3;
bool isprime;

int main()
{
    while(a<=100)
    {
    for(x=2;x<=y;x++)
    {
        if(y%x==0 && x!=y)
        {
            isprime=false;
            break;
        }
        else if(y%x!=0 && x!=y)
        {
            isprime = true;
        }

    }
    if(isprime==true  && y%x!=0 && x!=y)
    {
        cout<<a<<" is a prime number."<<"\n";
        isprime=false;
    }

      a++;
      y++;
    }
}
4

3 に答える 3

1

私の目に飛び込んできたのは、y をインクリメントしないことです。

y は最初は 3 なので、2 が a の可能な約数であるかどうかだけを試してから、次の a に進みます。

とにかく、あなたが y で何を達成したいのかわかりません。

a/2 より大きい数値を試す必要がないため、x を 2 から a/2 まで実行します。これは単純に、a/2 より大きい除数が存在しないためです。例: a = 30. 16 以上で除算しようとしても意味がありません。結果が整数になることはあり得ないためです (もちろん a 自体は別として)。

ただし、これはあなたが望むことをするはずです:

int x = 0; 
int a = 0;
bool isPrime = false;

for(a=3; a < 100; a+=2) 
{
    isPrime = true;
    for(x = 2; x <= a/2; x++) {
        if(a%x == 0) {
            isPrime = false;
            break;                                     
        }                    
    }
    if(isPrime) {
        cout << a << "\n";            
    }
}    

もちろん、素数を見つけることができる他のアルゴリズムもありますが、基本的にあなたのアプローチを使用したかったのです。

乾杯

クリス

編集:誰かが速かった:)

とにかく: a/2 より高く実行する必要はありません。これは重要な最適化です...!

EDIT2:

もちろん、別の最適化ではすべての偶数をスキップするため、a = 3 から開始し、ループの反復ごとに 2 ずつ増やします...

于 2013-04-18T10:52:46.760 に答える
1

これ

if(isprime=true && a%x!=0 && a!=y)

これであるべき

if(isprime==true && a%x!=0 && a!=y)

それはよくある間違いです。しかし、boolはtrue または falseであるため、bool を true または false と比較する必要がないことを理解することをお勧めします。これだけ

if (isprime && a%x!=0 && a!=y)

ロジックはすべて間違っているように見えます(そして複雑すぎます)。これを試してください

    isprime = true;
    for(x=2;x<a;x++)
    {
        if(a%x==0)
        {
            isprime = false;
            break;
        }
    }
    if (isprime)
    {
        cout<<a<<"\n";
    }

y は必要ありません。

于 2013-04-18T10:32:10.147 に答える