0

このプログラムを使用して、200 万未満のすべての素数の合計を見つけようとしていますが、何らかの理由で、予想をはるかに下回る数になりました。

これが私のコードです。共同作業者は、私のプログラムですべての素数をキャッチしていない可能性があると言いますが、彼は C++ を知らず、どうすれば素数を見逃すことができるのかわかりません。

#include <iostream>

using namespace std;

int main()
{
    int a = 500000;
    int e = 0;

    // this is an array to hold all the prime number i find,
    // it's initialized to the arbitrarily high number of 500000
    int list[a]; 

    //here i am initializing the first members of my list to the first primes
    list[0] = 2; 
    list[1] = 3;
    list[2] = 5;
    a = 3; // i set a = 3 to catch the next coming prime of 7
    for (int c = 5; c < 2000000; c++)
    {
        // this bool is for prime catching, 
        // if d is false then the number will not be saved into the array
        bool d = false; 

        // this bool is for an exit statement in the following iterative loop, 
        // if it's false the loop will exit
        bool h = true; 
        for (int i = 0; list[i] < c/2 + 1 && h == true; i++)
        {
            // this checks to see if a number is evenly 
            // divisable by any of my primes so far
            if (c % list[i] == 0) 
            {
                d = false;
                h = false;
            }
        }
        if (d == true)
        {
            list[a] = c; // if i find a prime i save it into my array
            e += c; // if i find a prime i sum it to my total
            a++;
        }
    }
    cout << e; 
}
4

3 に答える 3

4

d常にそして永遠に偽です。に設定するコードはありませんtrue

eまた、 10 (2 + 3 + 5)から開始する必要があります。

于 2013-03-22T15:57:38.907 に答える
0

私の意見では、数が素数かどうかを調べる最も効果的な方法は次のとおりです。

  • 数値が 4 未満 ( <=3) かどうかを確認すると、それは素数です。正の整数のみが参加すると仮定します。
  • それ以外の場合は、偶数かどうかを確認します。素数ではありません。
  • 3 を超え、偶数でない場合 - 3 から指定された数値の平方根までのすべての数値に対してチェックし、すべての偶数をスキップしてチェックします。任意の数の倍数である場合、それは素数ではありません。それ以外はプライムです。

C++ の言葉で:

bool IsPrime(unsigned int nCheck)
{
   assert(nCheck>0);

   if(nCheck<=3)
     return true;

   if(nCheck%2==0)
     return false;

   for(int nCounter = 3; nCounter <= sqrt(nCheck); nCounter += 2) // Skip evens
   {
       if(nCheck % nCounter == 0)
          return false;
   }
   return true;
}

任意の数値は、その数値の平方根に対して 1 です。たとえば、100 は最大 10 で割り切れます。たとえば、50 で割り切れる場合でも、5 で割り切れる場合もあります。したがって、1 から 10 までを確認してください。

于 2013-03-23T07:37:57.947 に答える