Pascal语言,用筛选法求出2~1000的质数
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Pascal语言,用筛选法求出2~1000的质数相关的知识,希望对你有一定的参考价值。
急用!!!!!!!!!!!!!!!!!!
Program zishu;Var a:array [2..1000] of integer;
b:array [2..1000] of boolean;
i,j:integer;
Begin
for i:=2 to 1000 do
begin
a[i]:=i;
b[i]:=true;
end;
i:=1;
repeat
i;=i+1;
if b[i]=true then
for j:=2 to 1000 div i
b[j*i]:=false;
until i=1000;
for i:=2 to 1000 do
if b[i]=true then write(a[i],' ');
End.
筛选法对小数据是可以的 但是要算到100000以上恐怕难了
这里还有Miller-Rabin判素数的方法:
费马小定理:如果P是一个素数,且0<a<p,则a^(p-1)≡1(mod p)
例如,67是一个素数,则2^66mod 67=1。
========不懂就慢慢理解========
========如果想要在联赛拿奖-这些方法还是要积累的======
var i,j,n,tot:longint;
find:boolean;
p:array[1..26] of integer=(2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101);
function power(a,t,r:longint):qword;
begin
if t=1 then exit(a mod r);
if t=0 then exit(1);
power:=power(a,t shr 1,r) mod r;
power:=power*power mod r;
if odd(t) then power:=power*a mod r;
end;
begin
WRite('Input n(Make from 2 to n):');
assign(output,'output.txt');
rewrite(output);
readln(n);
tot:=1;I:=1;WRite(2,',');
Repeat
I:=I+2;//delete ou shu
find:=true;
for j:=1 to 26 do
if (i<>p[j]) and (power(p[j],i-1,i)<>1) then
begin
find:=false;
break;
end;
if find then
begin
write(i,',');
If I Mod 20=0 Then Writeln;
inc(tot);
end;
Until I>N;
WriteLn;
writeln('==========',tot,'=========');
close(output);
end.
//输入N 文件输出output.txt 为1..n的所有素数 可用记事本或写字板打开 参考技术A Program zishu;
Var a:array [2..1000] of integer;
b:array [2..1000] of boolean;
i,j:integer;
Begin
for i:=2 to 1000 do
begin
a[i]:=i;
b[i]:=true;
end;
i:=1;
repeat
i;=i+1;
if b[i]=true then
for j:=2 to 1000 div i
b[j*i]:=false;
until i=1000;
for i:=2 to 1000 do
if b[i]=true then write(a[i],' ');
End.
(快给分)
有问题再请教.本回答被提问者采纳
以上是关于Pascal语言,用筛选法求出2~1000的质数的主要内容,如果未能解决你的问题,请参考以下文章