Понимание кода решения uva 10006 - PullRequest
0 голосов
/ 20 января 2019

Я нашел фрагмент кода для решения uva 10006: Тем не менее, я столкнулся с некоторыми трудностями, чтобы понять это (я использую Python и Java и никогда не использовал C ++ раньше). Я также не мог понять какую-то логику в этом.

Во-первых, как это эквивалентно питону?

bool isComp[MaxNumChecked];
bool isCar[MaxNumChecked];

Во-вторых, для условия в строке 23, где находится реализация для isComp [] для проверки, является ли число составным? Это что-то встроенное ??

if (!isComp[i]) 

В-третьих, цикл в строке 26, какие значения он перебирает?

for (int j = 3 * i; j < MaxNumChecked; j += 2*i)

Наконец, я мог бы сказать, что я мог глобально понять, что делает код, за исключением вышеупомянутых вопросов, но я не в состоянии понять комментарии с самого начала. Не могли бы вы объяснить мне?

// First, filter for primes
// Then, for each num, for every n greater than it, test if the carmichael doesn't hold
// This is sqrt(65005)

1 Ответ

0 голосов
/ 20 января 2019

Первый вопрос: в Python нет встроенных массивов.Вместо этого вы можете использовать список.Это локальные массивы.Вы можете прочитать больше об этом здесь:

Статический массив против динамического массива в C ++

Второй вопрос: это если оператор проверяет логическое значение, поэтому есть реализациядля этого.Он напрямую переводится в машинный код.

Третий вопрос: итерация начинается с 3 * i;j увеличивается на 2 * i (j = j + 2 * i) в конце каждой итерации;цикл останавливается, если j> = MaxNumChecked.

В комментариях говорится, что он фильтрует (прыгает) простые числа.Вот почему он делает шаг 2 вместо 1, чтобы избежать четных чисел.Он также начинается с 3, чтобы перейти на 1 и 2. Он не включает все простые числа, но, по крайней мере, наиболее очевиден.

Код, который вы изучаете, не оптимизирован.Он мог бы избежать некоторых повторных итераций и избежать некоторых выделений.

...