declare
v_num number;
v_now number;
v_yes number;
c_max number;
begin
v_num:=1;
c_max:=200;--这里设置最大数,想要100这内就写100,想要1000之内就写1000
loop
v_now:=2;--这里设置每一个数的初始被除数,从2开始
v_yes:=1;--设置初始参考数,1为素数,0为非素数,默认初始为1
if v_num<4 then
dbms_output.put_line(v_num);--1到3都是素数,这里就不再判断了
-- v_num:=v_num+1;--自增1
end if;
if v_num>=4 then
--这里开始判断,只能被1和本身整除的数,就是素数
loop
if mod(v_num,v_now)=0 and v_num<>v_now then --如果有能被整除的数,且被除数不是除数本身,就不是素数
v_yes:=0;
end if;
v_now:=v_now+1;--被除数递增
exit when v_now>=v_num;--当被除数大于除数时退出
end loop;--因为要一个一个的判断,所以要来一次循环
end if;
if v_num>4 and v_yes=1 then
dbms_output.put_line(v_num);
-- v_num:=v_num+1;--自增
end if;
v_num:=v_num+1;--自增
exit when v_num>=c_max;
end loop;
end;
参考一下,自己写的
收藏别人的,实测正确:
PLSQL计算质数:http://yangtingkun.itpub.net/post/468/53770
DECLARE
TYPE T_RECORD IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
V_RESULT T_RECORD;
I NUMBER DEFAULT 3;
N NUMBER DEFAULT 0;
BEGIN
DBMS_OUTPUT.PUT_LINE(2);
V_RESULT(1) := 3;
WHILE (I < 101) LOOP
FOR J IN 1 .. V_RESULT.COUNT LOOP
IF V_RESULT(J) * V_RESULT(J) > I THEN
DBMS_OUTPUT.PUT_LINE(I);
V_RESULT(V_RESULT.COUNT + 1) := I;
EXIT;
END IF;
IF TRUNC(I / V_RESULT(J)) = I / V_RESULT(J) THEN
EXIT;
END IF;
END LOOP;
IF N = 2 THEN
I := I + 4;
N := 1;
ELSE
I := I + 2;
N := N + 1;
END IF;
END LOOP;
V_RESULT(0) := 2;
END;
CREATE OR REPLACE
FUNCTION isPrime(
num IN NUMBER)
RETURN BOOLEAN
IS
BEGIN
IF(num<=1) THEN
RETURN FALSE;
END IF;
FOR i IN 2..(num-1)
LOOP
IF(mod(num,i)=0) THEN
RETURN FALSE;
END IF;
END LOOP;
RETURN TRUE;
END;
/
以前写得函数,过程循环调用一下就行