|
〇〇 发表于 2014-5-22 15:30 ![]()
varray与index by table的区别也几乎没有
SQL> exec pkg_newkid.LTV(2000000)
148933
create or replace package pkg_newkid is
TYPE t_row IS TABLE OF BINARY_INTEGER;
V_RESULT T_row:=t_row();
V_RESULT2 T_row:=t_row();
type ty_i is varray(10000000) of int;
V_RESULT3 ty_i:=ty_i();
function isprim (n number )
return number;
function isprimLT (n number )
return number;
function isprimLTV (n number )
return number;
PROCEDURE NEWKID(X IN NUMBER);
PROCEDURE LT(U IN NUMBER) ;
PROCEDURE LTV(U IN NUMBER) ;
end;
/
create or replace package body pkg_newkid is --用质数表
PROCEDURE NEWKID(X IN NUMBER) AS
I NUMBER DEFAULT 1;
J NUMBER DEFAULT 0;
C NUMBER DEFAULT 1;
lv_limit NUMBER := x;
lv_upper1 NUMBER := (SQRT(lv_limit)-1)/2;
lv_upper2 NUMBER := lv_limit/2-1;
lv_step BINARY_INTEGER;
BEGIN
v_result.EXTEND(lv_upper2);
while i<lv_upper1 loop
lv_step := i*2+1;
j:=2*i*(i+1);
while j<=lv_upper2 loop
v_result.DELETE(j);
j:=j+lv_step;
end loop;
i := v_result.NEXT(i);
end loop;
END;
PROCEDURE LT(U IN NUMBER)
AS
I NUMBER DEFAULT 3;
J NUMBER DEFAULT 0;
C NUMBER DEFAULT 1;
BEGIN
v_result2.EXTEND(U);
while(i<sqrt(U)) loop
if v_result2(i)=1 then --利用已经计算出的质数表
goto n;
end if;
j:=i*(i-2);
while (j<U) loop
v_result2(j):=1;
j:=J+i+i;
end loop;
<<n>>
I:=i+2;
end loop;
for j in 1 .. U/2 loop
if v_result2(j+j-1)is null then --只判断奇数
c:=c+1;
end if;
end loop;
DBMS_OUTPUT.PUT_LINE(c);
END;
PROCEDURE LTV(U IN NUMBER)
AS
I NUMBER DEFAULT 3;
J NUMBER DEFAULT 0;
C NUMBER DEFAULT 1;
BEGIN
v_result3.EXTEND(U);
while(i<sqrt(U)) loop
if v_result3(i)=1 then --利用已经计算出的质数表
goto n;
end if;
j:=i*(i-2);
while (j<U) loop
v_result3(j):=1;
j:=J+i+i;
end loop;
<<n>>
I:=i+2;
end loop;
for j in 1 .. U/2 loop
if v_result3(j+j-1)is null then --只判断奇数
c:=c+1;
end if;
end loop;
DBMS_OUTPUT.PUT_LINE(c);
END;
function isprim (n number )
return number
is
begin
if n=2 then
return 1;
elsif mod(n,2)=0 then
return 0;
elsif v_result.exists((n-1)/2) then
return 1;
end if;
return 0;
end;
function isprimLT (n number )
return number
is
begin
if n=2 then
return 1;
elsif mod(n,2)=0 then
return 0;
elsif v_result2(n)is null then
return 1;
end if;
return 0;
end;
function isprimLTV (n number )
return number
is
begin
if n=2 then
return 1;
elsif mod(n,2)=0 then
return 0;
elsif v_result3(n)is null then
return 1;
end if;
return 0;
end;
end;
/ |
|