PLSQL - 这个Prime数字代码如何工作?

时间:2016-10-06 10:48:16

标签: 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作为素数,这不是。如果你能帮我理解这个嵌套循环是如何工作的,我会非常感激。

谢谢。

3 个答案:

答案 0 :(得分:2)

让我们重写它,使它更简单:

FOR .. IN ..

所有它正在做的是,在外部循环中通过数字2 .. 50并且在内部循环中检查是否存在完全分成该值的数字;如果有,那么继续外循环,如果没有那么输出该数字是素数。

您的代码实际上是相同的代码,但由于不使用<!DOCTYPE html> <html> <body> <button id="one">Try it</button> <h1>JavaScript Functions</h1> <p id="demo"></p> <script> var x=document.getElementById("one").addEventListener("click", onefunction); function onefunction(){ //document.getElementById('demo').innerHTML=x; return 1; } 循环

而变得复杂

答案 1 :(得分:2)

代码正在查找最多50个所有素数。外部循环只是检查i的每个值,从2到50,看看该整数是否为素数。

对于i的每个值,它会尝试将该整数除以每个其他整数,从2开始。如果i可被j整除且没有余数({ {1}}为零)然后素数;除非它只能被自己整除(mod)。

一旦找到j=1的值(j除以i,或者它自身达到i,它就退出该内循环。

然后需要进一步检查以确定哪些条件实际导致它退出;因此,它是否真的是素数。

你可以用更清晰的(IMHO)逻辑做同样的事情:

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 :(得分:0)

如果我理解你的问题。

i = 4j = 2然后条件((mod(i, j) = 0) or (j = i))导致从内循环退出时,条件(j = i )为false并且程序没有转到行{ {1}}