求素数的筛法是公元前厄拉多赛提出来的:对于一个大整数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.
效果:
另:求素数还有: 试商判别法
对于奇数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.
效果: