回 帖 发 新 帖 刷新版面

主题:一个小题目

我自己出的一个小题目:输入a,输出<a>,表示不超过a的所有质数 我自己做的程序:
var a,b,c,d,e:integer;
begin
  readln(a);
  if a=2 then writeln('<2>=1');
  b:=0;
  e:=0;
  if a<>2 then
    begin
      for c:=2 to a do
        begin
          for d:=2 to c do
            begin
              if c mod d<>0 then e:=e+1;
              if e=c-1 then b:=b+1;
            end;
        end;
        writeln('<',a,'>=',b);
    end;
end.

却好像有点问题
帮忙改一下,谢谢!!!

回复列表 (共9个回复)

沙发

出的问题:
(1)1不是质数。
(2)你每次在执行d循环之前必须把e清零。
(3)b是不超过a的质数的个数,而c才是真正的质数。你输出的不应该是b,而是c。

板凳

改正后的程序:
VAR
   a, c, d, e: INTEGER; f: BOOLEAN;
BEGIN
    READLN(a);
    WRITE('<a> = ');
    FOR c := 2 TO a DO BEGIN
        e := 0; f := FALSE;
        FOR d := 2 TO c DO BEGIN
            IF c MOD d <> 0 THEN e := e + 1;
            IF e = c - 2 THEN BEGIN f := TRUE; END;
        END;
        IF f THEN WRITE(c, ' ');
    END;
END.

3 楼

你的问题在于 e增加之后没有归0
还有程序有点烦 可以优化一下

var a,b,c,d,e:integer;
begin
  readln(a);
  if a=2 then writeln('<2>=1');
  b:=0;
  e:=0;
{  if a<>2 then 这句可以不用写了
    begin}
      for c:={2}3 to a do 这里就写3
        begin
          for d:=2 to c do
            {begin}
              {if c mod d<>0 then e:=e+1;} if c mod d=0 then e:=e+1;
              {if e=c-1 then b:=b+1;} 
            {end;}
          if e=2 then begin b:=b+1;e:=0;end;   当然是判断2个约数核算咯
        end;
        writeln('<',a,'>=',b);
    end;
end.

4 楼

大括号代表删去的地方 这应该懂的哦 当然 题目出的也不是很严密 按你自己的想法 是输出个数吧

5 楼

我认为该用REPEAT语句做好些

6 楼

楼主以及后面给的算法似乎效率都比较低,不如用筛法做.

{init}
a[1]:=0;
for i:=2 to n do a[i]:=1;
i:=2;
{main}
while i<=n do
begin
  k:=i;
  while k<=n do
  begin
    k:=k+i;
    a[k]:=0;
  end;
  i:=i+1;
  while (a[i]=0) and (i<n) do i:=i+1;
end;


最后数组a中的非零数即是素数

7 楼

谢谢大家,我后来又编了一个:
var a,b,c,d,e:integer;
begin
  readln(a);
  d:=0;
  e:=0;
  for b:=2 to a do
    begin
      for c:=2 to b-1 do
        if b mod c<>0 then e:=e+1;
      if e=b-2 then b:=b+1;
      e:=0;
    end;
  writeln('<',a,'>=',b);
end.

麻烦大家再看一下,Thanks

8 楼

其实用筛法求素数+集合最快
readln(n);
s:=[2..n];
i:=2;
while i<=n do
begin
  k:=i;
  while k<=n do
  begin
    k:=k+i;
    s:=s-[k];
  end;
  i:=i+1;
  while (i in s) and (i<n) do i:=i+1;
end;
for i:=2 to n do
  if i in s then write(i:5);

9 楼

有错哦````~`~`

我来回复

您尚未登录,请登录后再回复。点此登录或注册