2017-03-26 13 views
1

私は7番目のプロジェクトオイラーの問題を抱えています。なぜこのコードがうまくいかないのかよく分かりません。それは問題ありませんが、10001で正解を返しません - 返す104745。10001st Prime - Project Euler

はい、私はそれが非効率的であることを知っています。

private void eulerSeven(int num) 
    { 
     // Start the Prime count at 3, with 2 already counted. 
     int primecount = 1, counter = 3; 

     //While num of primes counted < the nth prime 
     while (primecount < num) 
     {     
      bool isPrime = true; 
      //check every number from 2 -> the current number we're checking 
      for (int i = 2; i < counter; i++) 
      { 
       if (counter%i == 0) 
       { 
        //if divisible, not a prime 
        isPrime = false; 
        break; 
       } 
      } 
      if (isPrime) //If is a prime, increment counter 
      { primecount++; } 
      // Go to next number (only checking odds) 
      counter += 2; 
     } 

     //output nth prime 
     Console.WriteLine(counter); 
    } 
+0

コードを表示'//出力n番目のプライム 'の場合 – Lanorkin

+0

Console.WriteLine(counter); –

+2

は 'counter-2'にする必要があります。 – Lanorkin

答えて

0

@lanorkinで述べたように、問題があった。

counter - 2

でなければなりませんが、また、私はhttps://codereview.stackexchange.com/questions/124644/project-euler-7-10001st-primeを見てお勧めしたいと思いますので、このコードが何をすべき同じ、しかし非常に速い(私のマシンでは5ms):

static void Main(string[] args) 
{ 
    var stopwatch = Stopwatch.StartNew(); 
    Console.WriteLine(CalculateEulerSeven(10001)); // should be 104745 
    stopwatch.Stop(); 

    Console.WriteLine("Time to calculate in milliseconds : {0}", stopwatch.ElapsedMilliseconds); 
    Console.ReadKey(); 
} 

private static int CalculateEulerSeven(int num) 
{ 
    int primecount = 1, counter = 3; 

    while (primecount < num) 
    { 
     bool isPrime = IsPrime(counter); 

     if (isPrime) primecount++; 
     counter += 2; 
    } 

    return counter; 
} 

static bool IsPrime(int value) 
{ 
    if (value < 2) { return false; } 
    if (value % 2 == 0) { return value == 2; } 
    if (value % 3 == 0) { return value == 3; } 
    if (value % 5 == 0) { return value == 5; } 
    if (value == 7) { return true; } 

    for (int divisor = 7; divisor * divisor <= value; divisor += 30) 
    { 
     if (value % divisor == 0) { return false; } 
     if (value % (divisor + 4) == 0) { return false; } 
     if (value % (divisor + 6) == 0) { return false; } 
     if (value % (divisor + 10) == 0) { return false; } 
     if (value % (divisor + 12) == 0) { return false; } 
     if (value % (divisor + 16) == 0) { return false; } 
     if (value % (divisor + 22) == 0) { return false; } 
     if (value % (divisor + 24) == 0) { return false; } 
    } 

    return true; 
} 
関連する問題