0

私は範囲内のすべての素数を見つける方法をC ++で理解しようとしています(今のところ100を使用しています)

私はパフォーマンスについて心配していません.C ++で始めて、私の本からこのプログラムの演習を理解しようとしています. 以下で使用しようとしているプログラムがありますが、常に false を返します。何か案は?googles/bing のヘルプとスタック オーバーフローのほぼすべてを読みました。数値の入力で動作するコードを書くことができます。すべての数字をループするだけではありません

私が間違っていることについてのアイデアはありますか?

#include <iostream>

using namespace std;

bool isPrime(long n);
int main() 
{
    int i;
    //some vars
    char emptyVar;

    //first loop (to increment the number)
    for (i = 0; i <= 100; i++)
    {
        //checking all numbers below 100

        if (isPrime(i) == true)
        {
            //is true
            cout << i << ", ";
        }
        else if (isPrime(i) == false)
        {
            //is false
            cout <<"false , ";
        }
    }
    cin >> emptyVar;
}

bool isPrime(long n)
{
    long i =0;
    //checks to see if the number is a prime
    for (i = 2; i < n; i++) // sqrt is the highest possible factor
    {
        if ( n % i == 0) // when dividing numbers there is no remainder if the numbers are both factors
        {
            // is a factor and not prime
            return false;
        }
        else if (n % i != 0 && i >= 100)
        {
            //is not a factor
            return true;
        }
    }
}
4

3 に答える 3

2

関数には、可能なすべての実行パスのステートメントが含まれisPrimeているわけではありません。returnたとえばisPrime、いつ、何をしますn == 2か?

ループがどのように機能するかを次に示しforます (疑似コード)。一般的な構文は次のとおりです。

for (initialiazion; condition; increment) {
   body;
}
rest;

whileこれはループに変換できます。

initialiazion;
while (condition) {
  body;
  increment;
}
rest;

特に、beforeが実行されconditionた直後に がチェックされます。intializationbody

forループは次のように機能すると思います。

initialiazion;
do {
  body;
  increment;
} while (condition);
rest;

つまり、条件は最初の のincrementにチェックされます。しかし、そうではありません。

于 2013-02-24T20:14:49.120 に答える
1

最初に遭遇したものだけでなく、すべての i の因数でない場合は true を返す必要があります。

bool isPrime(long n)
{
    long i =0;
    //checks to see if the number is a prime
    for (i = 2; i < n ; i++) // sqrt is the highest possible factor
    {
        if ( n % i == 0) // when dividing numbers there is no remainder if the numbers are both factors
        {
            // is a factor and not prime
            return false;
        }
    }
    return true; 

}

また、あなたの場合、i > n/2 を超えて検索する意味がありません。もちろん、文献を参照する必要があります。これらは非常に堅牢な素数性テスト アルゴリズムです。

于 2013-02-24T20:16:57.700 に答える
0

あなたのisPrime機能は正しくありません。それはすべての数字をチェックし、それからのみチェックする必要がありますreturn true;

そして、このブロックはあなたの入力で呼び出されることはありません:

    else if (n % i != 0 && i >= 100)
    {
        //is not a factor
        return true;
    }
于 2013-02-24T20:18:11.197 に答える