痛而后能善
无惧于闯
Make a greate impact

用PL/SQL查找1-1000之间的素数
1.由于需要打印所以要扩充打印的缓冲,以下有两种方式:
exec dbms_output.enable(缓存大小);
set serveroutput on size 缓存大小;
2.第一次,采取了自顶向下的分析方法: 
declare
  reg number(4);
  num number(4);
  i number(4);
begin
     for num in 1..10000
     loop
         reg:=0;
         for i in 1..(num)
         loop
             if(num mod i = 0)then
                    reg:=reg+1;                   
             end if;
            
         end loop;
        
         if(reg = 2) then
                dbms_output.put_line(num);
         end if;
     end loop;
end;
第二次,采取折半查找方法,应为自然数一般最大的公约数为其一半:
declare
  reg number(4);
  num number(4);
  i number(4);
begin
     for num in 1..1000
     loop
         reg:=1;
         for i in 1..(num)/2
         loop
             if(num mod i = 0) then
                    reg:=reg+1;                   
             end if;
            
         end loop;
        
         if(reg = 2) and (num!=1) then
                dbms_output.put_line(num);
         end if;
     end loop;
end;
第三次,在折半查找法的基础上,添加判断条件,即如果除了1和自身以外还有别的数能整除,就推出循环。
declare
  reg number(4);
  num number(4);
  i number(4);
begin
     for num in 1..1000
     loop
         reg:=1;
         for i in 1..(num)/2
         loop
             if(num mod i = 0) then
                    reg:=reg+1;
                    if(reg=3)then
                       exit;
                    end if;                  
             end if;
            
         end loop;
        
         if(reg = 2) and (num!=1) then
                dbms_output.put_line(num);
         end if;
     end loop;
end;

3.总结
刚开始做的时候很郁闷,首先是oracle语句很久都没有练习了早以忘记,然后就是对于算法上的改进似乎比较慢,以前没有体会到算法可以提升程序的性能,今天算是领教了。第一个程序所需的时间为3秒左右,第二个需要1.6左右,第三个需要0.25秒左右。其次,如果能够用异步算法返回打印的效果可能更好,因为边算边打印从感觉上给用户带来快速的感觉,经管是障眼法。

posted on 2008-01-06 23:13  greater  阅读(1688)  评论(0编辑  收藏  举报