#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');