declare
創(chuàng)新互聯(lián)公司專注于東陽(yáng)網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠(chéng)為您提供東陽(yáng)營(yíng)銷(xiāo)型網(wǎng)站建設(shè),東陽(yáng)網(wǎng)站制作、東陽(yáng)網(wǎng)頁(yè)設(shè)計(jì)、東陽(yáng)網(wǎng)站官網(wǎng)定制、小程序設(shè)計(jì)服務(wù),打造東陽(yáng)網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供東陽(yáng)網(wǎng)站排名全網(wǎng)營(yíng)銷(xiāo)落地服務(wù)。
v_num number;
v_now number;
v_yes number;
c_max number;
begin
v_num:=1;
c_max:=200;--這里設(shè)置最大數(shù),想要100這內(nèi)就寫(xiě)100,想要1000之內(nèi)就寫(xiě)1000
loop
v_now:=2;--這里設(shè)置每一個(gè)數(shù)的初始被除數(shù),從2開(kāi)始
v_yes:=1;--設(shè)置初始參考數(shù),1為素?cái)?shù),0為非素?cái)?shù),默認(rèn)初始為1
if v_num4 then
dbms_output.put_line(v_num);--1到3都是素?cái)?shù),這里就不再判斷了
-- v_num:=v_num+1;--自增1
end if;
if v_num=4 then
--這里開(kāi)始判斷,只能被1和本身整除的數(shù),就是素?cái)?shù)
loop
if mod(v_num,v_now)=0 and v_numv_now then --如果有能被整除的數(shù),且被除數(shù)不是除數(shù)本身,就不是素?cái)?shù)
v_yes:=0;
end if;
v_now:=v_now+1;--被除數(shù)遞增
exit when v_now=v_num;--當(dāng)被除數(shù)大于除數(shù)時(shí)退出
end loop;--因?yàn)橐粋€(gè)一個(gè)的判斷,所以要來(lái)一次循環(huán)
end if;
if v_num4 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;
參考一下,自己寫(xiě)的
這2個(gè)函數(shù)是你說(shuō)的意思沒(méi)錯(cuò),你是不理解為什么這么用嗎?
我覺(jué)得這個(gè)函數(shù)和我理解的有點(diǎn)不一樣。
for v_j in 2 ..sqrt(v_u) loop;應(yīng)該是for v_j in 2 ..sqrt(v_i) loop;
v_u 應(yīng)該是函數(shù)接收的一個(gè)參數(shù),你說(shuō)100它就給你前100內(nèi)的素?cái)?shù),外層那個(gè)循環(huán)也應(yīng)該是以v_u為上限的。
這個(gè)函數(shù)結(jié)構(gòu)很簡(jiǎn)單,外層以2~100循環(huán),很明顯就是循環(huán)每個(gè)數(shù)字,內(nèi)層就是用來(lái)檢測(cè)v_i這個(gè)數(shù)字是不是素?cái)?shù)。
內(nèi)層循環(huán)就是由2~sqrt(v_i)逐個(gè)和v_i去mod,如果能整除,說(shuō)明這個(gè)v_i不是素?cái)?shù),因?yàn)檎业揭粋€(gè)數(shù)能整除,然后把標(biāo)志位v_flag置為0,內(nèi)層循環(huán)完了,后面if v_flag = 1 then dbms_output.put_line(v_i);就是如果這個(gè)標(biāo)志位還是1,沒(méi)變化過(guò),說(shuō)明沒(méi)找到過(guò)能整除v_i的數(shù),也就是說(shuō)這個(gè)數(shù)是素?cái)?shù)。
至于內(nèi)層循環(huán)循環(huán)為什么只要2~sqrt(v_i)就夠了,這是個(gè)數(shù)學(xué)問(wèn)題,我答不上來(lái),反正就是這樣,這個(gè)范圍是嚴(yán)謹(jǐn)?shù)?,而且?duì)于這種驗(yàn)證方法,平方根要省很多時(shí)間,我們驗(yàn)證97的時(shí)候肯定不用循環(huán)到96,也不用循環(huán)到一半,sqrt就夠了。
--創(chuàng)建中間表
create table t_1 (
num number(6));
--1--100數(shù)據(jù)寫(xiě)到中間表
begin
for r1 in 1..100 loop
insert into t_1 (num) values (r1);
commit ;
end loop ;
end ;
--結(jié)果
select *
from t_1 t
where not exists (select *
from t_1 a, t_1 b
where a.num * b.num = t.num
and a.num 1
and b.num 1)
order by 1 ;
本過(guò)程輸入?yún)?shù)inp,計(jì)算1到inp之間的素?cái)?shù)
算法:
拿出1-inp之間的每個(gè)數(shù)i,用2到i的平方根之間的每個(gè)數(shù)去除,全部除不盡的即為素?cái)?shù),有一個(gè)能除盡的為非素?cái)?shù)
set serverout on
create or replace procedure is_prime(inp number)
as
i number;
j number;
is_prim boolean;
begin
dbms_output.new_line;
dbms_output.put(to_char(2)||' ');
for i in 3..inp loop
begin
is_prim:=true;
for j in 2..trunc(sqrt(i)) loop
if mod(i,j)=0 then
begin
is_prim:=false;
exit;
end;
end if;
end loop;
if is_prim then dbms_output.put(to_char(i)||' '); end if;
end;
end loop;
dbms_output.new_line;
end;
/
exec is_prime(100)
declare
/*思路:素?cái)?shù)是只能被1和它本身整除的數(shù),針對(duì)一個(gè)數(shù)n,從2到n-1對(duì)其求模,如果能整除就不是素?cái)?shù)*/
v_result number; /*是否為素?cái)?shù),1為素?cái)?shù),0為非素?cái)?shù)*/
j number; /*從2到i-1取模,如果能被整除就不是素?cái)?shù)*/
begin
for i in 1 .. 100 loop
j := 2;
v_result := 1;
loop
if mod(i, j) = 0 and i j then
v_result := 0;
end if;
j := j + 1;
exit when j = i;
end loop;
if v_result = 1 then
dbms_output.put_line(i);
end if;
end loop;
end;