2012-01-11 5 views
0

У меня проблемы с массивами. Я скопировал этот код из книги:Отличие между двумя индексами массива?

#include <stdio.h> 
#include <stdbool.h> 

int main (void) 
{ 
    int  p, i, primes[50], primeIndex = 2; 
    bool isPrime; 

    primes[0] = 2; 
    primes[1] = 3; 

    for (p = 5; p <= 50; p = p + 2) { 
     isPrime = true; 

     for (i = 1; isPrime && p/primes[i] >= primes[i]; ++i) 
      if (p % primes[i] == 0) 
       isPrime = false; 

     if (isPrime == true) { 
      primes[primeIndex] = p; 
      ++primeIndex; 
     } 
    } 

    for (i = 0; i < primeIndex; ++i) 
     printf ("%i ", primes[i]); 

    printf ("\n"); 

    return 0; 
} 

В частности, у меня возникают проблемы с пониманием разницы между primeIndex и i переменными. primeIndex относится к номеру массива, а i относится к числу, помещенному в массив. Правильно?

+0

Кто-нибудь знает название этого алгоритма? – bacchus

+0

Обратите внимание, что когда вы устанавливаете 'isPrime = false;', вы также можете разумно добавить 'break;' (и скобки '{...}'), чтобы закончить цикл раньше. –

+0

Еще хуже: весь логический (loop-инвариант + 1/2) 'isPrime' может быть удален goto, а add-to-array может быть скомпенсирован до' primes [primeIndex ++] = p; 'BTW' p < = 50' тест должен быть 'primeIndex <50' – wildplasser

ответ

3

primeIndex - это место, где следующее найденное первичное значение записывается в массив prime, а также количество известных до сих пор простых чисел. i - индекс простого числа, используемого для пробного деления. Для каждого кандидата i петли из 1 (нам не нужно проверять primes[0] = 2, потому что проверяются только нечетные числа) до индекса первого простого числа, большего, чем квадратный корень кандидата.

+0

Теперь я понимаю разницу. Но взглянув на первый номер p, который выполняет компьютер, который равен 5, не завершит цикл, так как 5/3 меньше 3? – user1064913

+0

Внутренний цикл, который проверяет, заканчивается ли 'p'. Затем, поскольку 'isPrime' не был установлен в false, 5 записывается в массив' prime' в месте 'primeIndex' (2),' primeIndex' увеличивается, а внешний цикл переходит в следующий раунд, добавляя 2 к ' p' и, таким образом, проверяя 7. Опять внутренняя петля немедленно заканчивается: «primes [3] = 7', внешняя петля с' p = 9' ... –

+0

Спасибо. Теперь я понимаю. – user1064913

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