- UID
- 18935591
- 阅读权限
- 20
- 帖子
- 805
- 精华贴数
- 5
- 技术排名
- 1086
- 技术积分
- 2186
- 社区排名
- 36593
- 社区积分
- 3
- 注册时间
- 2009-2-5
- 精华贴数
- 5
- 技术积分
- 2186
- 社区积分
- 3
- 注册时间
- 2009-2-5
- 论坛徽章:
- 8
|
集合的next()和exists()开销都比较高,
所以前面的delete操作改成修改状态。
这样改动又能提高了半个数量级的性能。 - create or replace procedure q370d(arg integer default 1e6) is
- q integer;
- p integer;
- sm integer:=0;
- type typen1 is table of boolean index by pls_integer;
- type typen2 is table of typen1 index by pls_integer;
- frac typen2;
- begin
- for q in 3 .. sqrt(arg/2) loop
- for p in ceil((sqrt(5)-1)/2*q) .. q-1 loop
- frac(q)(p) := true;
- end loop;
- end loop;
- for q in 3..sqrt(arg/2)/2 loop
- for p in ceil((sqrt(5)-1)/2*q) .. q-1 loop
- for k in 2..sqrt(arg/2)/q loop
- frac(q*k)(p*k):=false;
- end loop;
- end loop;
- end loop;
- sm:=0;
- for q in 3 .. sqrt(arg/2) loop
- for p in ceil((sqrt(5)-1)/2*q) .. q-1 loop
- if frac(q)(p) then
- sm:=sm+floor(arg/(p*(p+q)+q*q));
- end if;
- end loop;
- end loop;
- sm:=sm+ floor(arg/3);
- dbms_output.put_line('total: '||sm);
- end q370d;
复制代码 这次甚至可以尝试1e8了:
SQL> exec q370d(1e6)
total: 861805
PL/SQL procedure successfully completed
Executed in 0.094 seconds
SQL> exec q370d(1e7)
total: 9712598
PL/SQL procedure successfully completed
Executed in 0.796 seconds
SQL> exec q370d(1e8)
total: 108073540
PL/SQL procedure successfully completed
Executed in 8.127 seconds
SQL>
|
|