一个判断2..100以内的质数算法引起的几点疑惑。
先看算法:
【使用while-1-plsql】 declare v_i number(3) := 2; v_j number(3) :=2; v_flag number(1) := 1; begin while v_i <= 100 loop while v_j <= sqrt(v_i) loop if mod(v_i,v_j) = 0 then v_flag := 0; end if; v_j := v_j +1; end loop; if v_flag = 1 then dbms_output.put_line(v_i); end if; v_j := 2; v_i := v_i+1; v_flag := 1; end loop; end;
【使用while-2-python】 i = 2 while i < 100: j = 2 while j <= (i/j): if not(i%j): break j += 1 if (j > i/j) : print(i, " 是素数") i += 1
【使用for】 declare v_flag number(1) := 1; begin for c in 2..100 loop for d in 2..sqrt(c) loop if mod(c,d) = 0 then v_flag := 0; goto label;//跳到label标签处,相当于跳出循环 end if; end loop; <<label>> if v_flag = 1 then dbms_output.put_line(c); end if; v_flag := 1; end loop; end;
说明一下内层循环为什么以sqrt(i)为分界点:
首先,约数是成对出现的。比如24,你找到个约数3,那么一定有个约数8,因为24/3=8。 然后,这对约数必须一个在根号n之前,一个在根号n之后。因为都在根号n之前的话,乘积一定小于n(根号nX根号n=n)。同样,都在根号n之后的话,乘积一定大于n。 所以,如果你在根号n之前都找不到约数的话,那么根号n之后就不会有了。