求1~n中的素数可以用普通的筛法做(不会别往下看),时间复杂度大约为O(nloglogn),但n再大,就接受不了了,用线性筛只要——O(n)!!!
这里需要复习一下,普通筛法的原理:
每一个素数的倍数都为合数。
即:
for i:=2 to trunc(sqrt(n)) do
if m[i] then
for j:=2 to n div i do m[i*j]:=false;
但是,我们发现,这标记打的重复了!!!
比如:
线性筛用的是第二个原理:
每一个数(1,0除外)的倍数都是合数。
这样不是就不重复了么。
像:
不就是由4乘上5这个质因数转化的么。
上代码:
for i:=2 to n do
begin
if bz[i]=0 then
begin
inc(t);
p[t]:=i;//加入素数
end;
for j:=1 to t do
begin
if i*p[j]>n then break;//超出退出
bz[i*p[j]]:=1; //标记
if i mod p[j]=0 then break;//如果这个会被其他数处理,退出
end;
end;
不要谢我,点击关注。