问个问题,有关筛法求质数(1~100000),不知如何优化才能不超时
pascal吧
全部回复
仅看楼主
level 1
XiphoidXeric 楼主
据说是要加利用sqrt(N)的优化的,否则容易超时,现在已经加了为什么依然超时~vara:array[1..100] of integer;i,j:integer;begina[1]:=0;for i:=2 to 100 do a[i]:=i;for i:=2 to trunc(sqrt(100)) dobeginif a[i]<>0 thenbeginj:=2*i;while a[j]<=100 dobegina[j]:=0;j:=j+i;end;end;end;for i:=1 to 100 doif a[i]<>0 then write(a[i]:5);end.请不要重写程序,只是适当修改~
2008年05月04日 08点05分 1
level 1
XiphoidXeric 楼主
更正,所有100应该是100000
2008年05月04日 08点05分 2
level 1
j := 2*i 改为 j = i * i;
2008年05月04日 09点05分 3
level 1
更正j := 2 * i; 改为 j := i * i;
2008年05月04日 09点05分 4
level 1
有这条语句在for i:=2 to 100000 do a[i]:=i;肯定超时! 你的程序必须重新写!
2008年05月04日 09点05分 5
level 1
看了一下,思路好象没错,调试的时候用的是什么编译器?FREE PASCAL?有的编译器不支持大数组,而且你定义的integer类型不够大,放大数肯定溢出,建议改int64,但这样又占了很大的内存.最好把编译时的信息发出来,不然不知道错哪.判断是否执行完循环,可以加断点输出.初步分析你的是变量数值溢出,导致循环判断出错不能结束.改程序太痛苦,我也懒得改了,以后让人看程序一定要写注释,不要一扔代码就让人帮你改,没注释看都得半天,没几个人愿意耐心分析你的源码的.
2008年05月07日 09点05分 6
level 1
先筛出sqrt(100000)内的素数,再用这张素数表筛100000内的。
2008年05月08日 10点05分 7
level 1
回复:8楼
然后呢?
代码呢?
2010年09月12日 11点09分 9
level 5
如果不用文件的话,应该会慢的[我不用文件时,输出就有些慢,但是用了文件操作后,就在1s内出结果了]
我也用的筛选法,为什么我的就那么快。。。而且我的代码也很短啊。。。
完全是我自己写的哦。。。。别说我抄别人的。。。。。
[小声:我家电脑已经够卡了。。。]
看看我程序吧。。。。。。。
var
   n,i,x:longint;
   f:boolean;
   a:array[1..100000] of boolean;
begin
   assign(output,'1.txt');rewrite(output);//文件操作
   readln(n);
//因为布尔型变量或者数组的初值都是false,所以我们可以不用再定义初值,直接进行数据处理
   for i:=2 to n do//由于1不是质数,所以从2开始循环
     if a[i]=false then begin//如果a[i]在之前没有被筛掉,那么就为质数
       writeln(i);//输出
       x:=i*2;//进行筛选,x初始化
       while x<=n do begin//如果x≤n,那么进入循环,进行筛选
         a[x]:=true;
         x:=x+i;//准备筛选下一个数
       end;
     end;
   close(output);//关闭文件
end.
2010年09月20日 14点09分 10
level 5
汗!
2010年10月15日 12点10分 11
level 1
请各位IQ起来,这些算法看上去筛法,其实都是o(n方)
2014年04月05日 05点04分 12
1