永发信息网

Pascal筛法求质数的一个代码,有些不懂,麻烦高手指点

答案:1  悬赏:20  手机版
解决时间 2021-05-06 00:55
  • 提问者网友:酱爆肉
  • 2021-05-05 09:53

代码如下:

Program prime;

var  a:array[0..10000000]of boolean;

       p:array[0..5000000]of longint;

       pn,n,i,j:longint;

begin

       assign

       ....                                        //这一部分省略

       readln(n);

       for i:=2 to trunc(sqrt(n)) do  // 这一句有点问题,trunc是什么?——1

       begin

          if not a[i] then                   //这个地方也不懂,书上说"设当i为合数时a[i]的值

             for  j:=2 to n div i do         为true” 但是,之前并没有定义啊——2

                   a[i*j]:=true;

        end;

        for i:=2 to n do

             if not a[i] then

             begin

                     inc(pn);

                     p[pn]:=1;

              end;                               

         for  i:=1 to  pn-1 do

            write(p[i],' ');

         writeln(p[pn]);                     //这后面的都没问题,就是将未被筛去的数存入p数

       close                                      组中,然后再依次输出吧

       ....

end.

   主要问题我都标上了序号,麻烦高手指点指点..

最佳答案
  • 五星知识达人网友:独钓一江月
  • 2021-05-05 10:09

1.这里是取整,看你说的已经知道函数意义了,这里不是求质数,若简单开个根号就求出质数,那就太简单了。这个程序是标准的算法,《素数筛》,取整是FOR循环的要求,从数学上无实际意义,sqrt(n)是数学上证明的,这里直接利用数学知识。


2. if not a[i] then    //这个地方也不懂,书上说"设当i为合数时a[i]的值


    for  j:=2 to n div i do    为true” 但是,之前并没有定义啊——2


    a[i*j]:=true;    //



程序要前后关联看


看//那一行,就是对数组A的变更。之前全都是false,和书上写的没有冲突,

我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯