0

私は現在、10001 番目の素数を見つけるために、プロジェクト オイラーの問題の 1 つを解決しようとしています。私のコードは正しい数値を返していませんが、「カウント」の開始値を変更したときに偶数を返しました。以下は私のコードです。誰かがこれを手伝ってくれれば幸いです。

#include <math.h>
#include <iostream>
#include <stdbool.h>
using namespace std;

bool isPrime(int num);

int main()
{
    int num = 0, count = 0;
    while(count < 10001)
    {
        num++;
        while(isPrime(num) != true)
        {
               num++;
               cout << "\n num: " << num;   
        }
        count++;
        isPrime(12);
    }
    cout << "the 10001's prime number is: " << num << "\n " << count;
    system("pause");
    return 0;
}


bool isPrime(int num)
{
       bool checkPrime = false;
       if(num%2 != 0)
       {
              for(int i = 3; i <= sqrt(num); i++)
              {
                      if(num%i != 0)
                      {
                              checkPrime = true;
                      }
                      else
                      {
                          checkPrime = false;
                          break;   
                      }       
              }  
       }
       else
       {
           return false;   
       }
       if(checkPrime)
       {
              return true;    
       }
       else
       {
           return false;    
       }      
}
4

1 に答える 1

3

isPrime のロジックが間違っています。たとえば、isPrime(3) は false を返します。基本的な問題は、checkPrime を true ではなく false に初期化して、for ループに入らない小さな数値が素数であっても false を返すことです。

これは (できれば) 正しいバージョンで、Dukeling が提案したいくつかの変更も含まれています。

bool isPrime(int num)
{
    if (num < 2) // numbers less than 2 are a special case
        return false;
    bool checkPrime = true; // change here
    int limit = sqrt(num);
    for (int i = 2; i <= limit; i++)
    {
        if (num%i == 0)
        {
            checkPrime = false;
            break;   
        }       
    }  
    return checkPrime;
}
于 2013-09-30T10:36:45.217 に答える