2015-10-16 3 views
0

В качестве новичка я сделал программу, которая находит количество простых чисел (prime), которые не превышают входное натуральное число (x). Программа работает отлично (я думаю), но я хочу, чтобы она работала быстрее (для более высоких чисел). Возможно ли, и если да, то как?C оптимизация программы/увеличение скорости

#include <stdio.h> 

int main() { 
    int x, i, j, flag = 1, prime = 0 ; 

    scanf("%d", &x); 
    for (i = 2; i <= x; i++) { 
     j = 2; 
     while (flag == 1 && j < i/2 + 1) { 
      if (i % j == 0) { 
       flag = 0; 
      } 
      j++; 
     } 
     if (flag == 1) { 
      prime++; 
     } 
     flag = 1; 
    } 
    printf("%d\n", prime); 
    return 0; 
} 
+5

1: Найти лучший алгоритм. 2. Для вашего текущего алгоритма обратите внимание, что существует только одно четное простое. 3. Для вашего текущего алгоритма обратите внимание, что если вы не нашли делителя в первых числах 'sqrt (n)', 'n' является простым. – EOF

+1

Составьте список или массив каждого числа, найденного до сих пор. Проверяйте их только как делители. Нет никакого смысла в тестировании, если '6' является делителем, если он уже прошел мимо' 2' и '3' в качестве делителей. –

+0

Посмотрите на сито Эратосфена. На этом можно построить несколько более эффективный алгоритм. –

ответ

1

Ваш алгоритм выполняет пробное деление, которое происходит медленно. Лучший алгоритм является 2000-летний Решето Эратосфена:

function primes(n): 
    sieve := makeArray(2..n, True) 
    for p from 2 to n 
     if sieve[p] 
      output p # prime 
      for i from p*p to n step p 
       sieve[i] := False 

Я оставлю его вам перевести C. Если вы хотите узнать больше, я скромно рекомендую эссе Programming with Prime Numbers в моем блоге.

+0

Должен ли' for i от p * p до n шагов p' быть 'для i от p + p до n step p'? –

+0

@WeatherVane no. –

+1

@WillNess yes Я вижу ... 'p + p' позаботился о' 2'. 'p + p + p' позаботился« 3 »и так далее. –

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