筛选法求素数

求素数的筛法是公元前厄拉多赛提出来的:对于一个大整数x,只要知道不超过sqrt(x)的所有素数p,划去所有p的倍数2p, 3p, ……剩下的整数就是不超过x的全部整数

 

代码示例: 求[1..100]的所有素数:

 

program project1;
//  求素数的筛法是公元前厄拉多赛提出的
//  对于一个大整数x,只要知道不超过sqrt(x)的所有素数p,
//  划去所有p的倍数2p, 3p, ……剩下的整数就是不超过x的全部整数
var
  i, j: integer;
  prime: array[0..100] of integer;
begin
  fillchar(prime, sizeof(prime), 0);
  //如果i不是素数的 将prime[i]置1,最后prime[i]是0的就是素数
  i := 4;
  while i <= 100 do
  begin
    prime[i] := 1;
    Inc(i, 2);
  end;
  for i := 3 to trunc(sqrt(100)) do
    if prime[i] = 0 then
    begin
      j := i * i;
      while j <= 100 do
      begin
        prime[j] := 1;
        Inc(j, i);
      end;
    end;
  j:=0;
  for i := 2 to 100 do
  begin
    if prime[i]=0 then
    begin
      write(i, ' ');
      inc(j);
      if j mod 10 = 0 then
      writeln;
    end;
  end;
  readln;
end.
效果:
mx36E22

另:求素数还有: 试商判别法

对于奇数i, 若存在某个j(在[3..sqrt(i)]范围内)能整除i, 则i不是素数, 否则i是素数。

代码示例: 求[1..100]的所有素数:

program project2;

var
  i, j, num: integer;
  isprime: boolean;
begin
  Write(2, ' ');
  num := 1;
  i := 3;
  while i < 100 do
  begin
    isprime := True;
    for j := 3 to trunc(sqrt(i)) do
      if i mod j = 0 then
      begin
        isprime := False;
        break;
      end;
    if isprime then
    begin
      Write(i, ' ');
      Inc(num);
      if num mod 10 = 0 then
        writeln;
    end;
    Inc(i, 2);
  end;
  readln;
end.

效果:

mx3877C

posted @ 2012-03-01 23:23  wouldguan  阅读(538)  评论(0编辑  收藏  举报