PLSQL — Как работает этот код простого числа?

#oracle #plsql

#Oracle #plsql

Вопрос:

 DECLARE
   i number(3);
   j number(3);
BEGIN
   i := 2;
   LOOP
      j:= 2;
      LOOP
         exit WHEN ((mod(i, j) = 0) or (j = i));
         j := j  1;
      END LOOP;
   IF (j = i ) THEN
      dbms_output.put_line(i || ' is prime');
   END IF;
   i := i   1;
   exit WHEN i = 50;
   END LOOP;
END;
  

Код работает правильно. Я попытался выяснить, как это работает, и в итоге получил 4 в качестве простого числа, а это не так. Если бы вы могли помочь мне понять, как работает этот вложенный цикл, я был бы очень благодарен.

Спасибо.

Комментарии:

1. Что конкретно вы не понимаете?

2. Спасибо всем, на мой вопрос дан ответ. Я просто немного запутался на одном шаге, но теперь все ясно.

Ответ №1:

Код ищет все простые числа до 50. Внешний цикл просто проверяет каждое значение i от 2 до 50, чтобы увидеть, является ли это целое число простым.

Для каждого значения i он пытается разделить это целое число на любое другое целое число одно за другим, начиная с 2 . Если i делится на j без остатка ( mod равно нулю), то оно не является простым; если только оно не делится только на себя ( j=1 ) .

Он завершает этот внутренний цикл, как только находит значение j , на которое делится i , или достигает i самого себя.

Затем требуется дополнительная проверка, чтобы увидеть, какое из этих условий фактически привело к его завершению; и, следовательно, является ли оно на самом деле простым.

Вы могли бы сделать то же самое с немного более понятной (ИМХО) логикой:

 BEGIN
  <<OUTER>>
  FOR i IN 2..50 LOOP
    FOR j IN 2..i-1 LOOP
       IF (mod(i, j) = 0) THEN
         CONTINUE OUTER;
      END IF;
    END LOOP;
    dbms_output.put_line(i || ' is prime');
  END LOOP;
END;
/
  

Ответ №2:

Давайте перепишем его, чтобы он был немного проще:

 BEGIN
  <<outer_loop>>
  FOR value IN 2 .. 50 LOOP
    FOR divisor IN 2 .. value - 1 LOOP
      CONTINUE outer_loop WHEN MOD( value, divisor ) = 0;
    END LOOP;
    DBMS_OUTPUT.PUT_LINE( value || ' is prime' );
  END LOOP;
END;
/
  

Все, что он делает, это во внешнем цикле, проходящем через число 2 .. 50, а во внутреннем цикле проверяет, есть ли число, которое точно делится на это значение; если есть, то продолжайте внешний цикл, а если нет, то выводите, что число простое.

Ваш код фактически является тем же кодом, но он усложняется отсутствием FOR .. IN .. циклов

Ответ №3:

Если я понимаю ваш вопрос.

Условие When i = 4 и j = 2 then ((mod(i, j) = 0) or (j = i)) приводит к выходу из внутреннего цикла, но условие (j = i ) равно false, и программа не переходит к строке dbms_output.put_line(i || ' is prime');