主题:一个小题目
pigone121
[专家分:10] 发布于 2007-08-24 18:13:00
我自己出的一个小题目:输入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个回复)
沙发
Matodied [专家分:7560] 发布于 2007-08-24 19:32:00
出的问题:
(1)1不是质数。
(2)你每次在执行d循环之前必须把e清零。
(3)b是不超过a的质数的个数,而c才是真正的质数。你输出的不应该是b,而是c。
板凳
Matodied [专家分:7560] 发布于 2007-08-24 19:49:00
改正后的程序:
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 楼
wangmin650 [专家分:0] 发布于 2007-08-24 23:22:00
你的问题在于 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 楼
wangmin650 [专家分:0] 发布于 2007-08-24 23:23:00
大括号代表删去的地方 这应该懂的哦 当然 题目出的也不是很严密 按你自己的想法 是输出个数吧
5 楼
万里长城 [专家分:340] 发布于 2007-08-26 17:17:00
我认为该用REPEAT语句做好些
6 楼
游侠UFO [专家分:1200] 发布于 2007-08-27 11:03:00
楼主以及后面给的算法似乎效率都比较低,不如用筛法做.
{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 楼
pigone121 [专家分:10] 发布于 2007-08-28 16:30:00
谢谢大家,我后来又编了一个:
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 楼
JRX [专家分:180] 发布于 2007-08-29 21:48:00
其实用筛法求素数+集合最快
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 楼
迷路的天使 [专家分:1340] 发布于 2007-11-20 19:03:00
有错哦````~`~`
我来回复