2015-09-17 4 views
2

Я пытаюсь получить сумму первых 1000 простых чисел в C#, но код, который я использую, очень медленный, требуется навсегда для вычисления и до сих пор не возвращался с действительной суммой.Сумма первых 1000 простых чисел в C#

Я новичок в этом, и я надеялся, что кто-нибудь из вас, ребята, может взглянуть и помочь мне сделать мой код эффективным, а также сообщить мне, что я делаю неправильно. Также дайте мне знать, если я делаю что-то неправильно в отношении правил форума.

Заранее благодарим за ценное время!

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace ConsoleApplication3 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      long sumOfPrime=0; 

      Console.WriteLine("Calculating Sum of Prime"); 

      for (int i = 1, primeCounter = 0; primeCounter <= 1000; ++i) 
      { 
       if (!IsPrime(i)) 
       { 
        continue; 
       } 
       else 
       { 
        primeCounter = +1; 
        sumOfPrime = +i; 
       } 
      } 

      Console.WriteLine(sumOfPrime); 
     } 

     static bool IsPrime(int number) 
     { 
      if (number == 1) 
      { 
       return false; 
      } 

      if (number == 2) 
      { 
       return true; 
      } 

      for (int i = 2; i <= Math.Ceiling(Math.Sqrt(number)); ++i) 
      { 
       if (number % i == 0) 
       { 
        return false; 
       } 
      } 

      return true; 
     } 
    } 
}  
+1

Ну, сначала попробуйте найти первые 1000 простых чисел. При этом вы можете вывести результат, чтобы вы могли узнать: a) если в первую очередь получить числа, и b) где происходит замедление. Когда у вас 1000 чисел в массиве или списке, их суммирование должно быть тривиальным. – GolezTrol

+4

Этот вопрос относится к другим сайтам, таким как [Обзор кода] (http://codereview.stackexchange.com/) – Marusyk

+1

Посмотрите на различные алгоритмы, доступные для генерации простых чисел. Бывают более быстрые. https://en.wikipedia.org/wiki/Generating_primes –

ответ

7

Ваша ошибка в:

primeCounter = +1 

Это сбрасывает счетчик каждый раз. Я думаю, что вы имеете в виду

primeCounter += 1 

... который увеличивает его. Или даже лучше:

primeCounter++ 
+1

И, конечно же, 'sumOfPrime' имеет ту же проблему. – hvd

0

Следующие возвращенные 3682913 в качестве суммы первых 1000 простых чисел и сделали это менее чем за секунду. Я не уверен, что я следую логике в цикле for вашего метода IsPrime.

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace Find1000Primes 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      int totalPrime = 0; 
      int countPrime = 1000; 
      int x = 0; // counter for the primes 
      int i = 0; // each number that is checked starting with 0 

      while (x < countPrime) 
      { 
       bool prime = IsPrime(i); 
       if (prime) 
       { 
        totalPrime = totalPrime + i; 
        x++; 
       } 
       i++; 
      } 
      Console.WriteLine(totalPrime.ToString()); 
      Console.ReadLine(); 
     } 

     public static bool IsPrime(int number) 
     { 
      if ((number & 1) == 0) 
      { 
       if (number == 2) 
        return true; 
       else 
        return false; 
      } 

      for (int i = 3; (i*i) <= number; i+=2) 
      { 
       if ((number % i) == 0) 
        return false; 
      } 
      return number != 1; 
     } 
    } 
} 
+1

Действительно? Логика метода «IsPrime» OP такая же, как ваша, за исключением того, что вы рассматриваете четные числа как частный случай, тогда как OP проверяет его вместе с другими возможными делителями в цикле 'for'. – hvd

+0

Что еще лучше, чем проверка только нечетных чисел, это проверка только простых чисел, которые были ранее обнаружены; используя этот подход в C++ на Linux, я смог получить результат почти мгновенно –

Смежные вопросы