用筛法求出100以内的全部素数

萌到你眼炸
576次浏览
2021年02月02日 01:10
最佳经验
本文由作者推荐

严寒的反义词-一生所爱吉他谱

2021年2月2日发(作者:十一阅兵)

6
、用筛法求出
100
以内的全部素数,并按每行五个数显示。< br>

【问题分析】





2< br>到
100
的自然数放入
a[2]

a[100]
中( 所放入的数与下标号相同)





在数组元素中,以下 标为序,按顺序找到未曾找过的最小素数
minp,
和它的位置
p
(即下标号 )






p+1
开始,把凡是能被
minp
整除的各元素值从
a
数组中划去(筛掉)
,也就是给该元素 值置

0






p=p+ 1
,重复执行第②、③步骤,直到
minp>Trunc(sqrt(N))
为止;




打印输出
a
数组中留下来、未被筛掉的各元素值,并按每行五个数显示。


用筛法求素数的过程示意如下(图中用下划线作删去标志)





2 3 4 5 6 7 8 9 10 11 12 13 14 15

98 99 100
{置数}




2 3 4 5 6 7 8 9 10 11 12 13 14 15

98 99 100 {
筛去被
2
整除的数

}



2 3 4 5 6 7 8 9 10 11 12 13 14 15

98 99 100 {
筛去被
3
整除的数

}

……

2 3 4 5 6 7 8 9 10 11 12 13 14 15

98 99 100 {
筛去被整除的数

}

Program Exam53;

const N=100;

type xx=1 .. N; {
自定义子界类型
xx
(类型名)
}

Var a: array[xx] of boolean; i,j: integer;

Begin

Fillchar(a,sizeof(a),true);

a[1] := False;

for i:=2 to Trunc(sqrt(N)) do

if a[I] then

for j := 2 to N div I do

a[I*j]:= False;

t:=0;

for i:=2 to N do

if a[i] then

Begin

write(a[ i ]:5); inc(t);

if t mod 5=0 then writeln

end;

End.





【例
3

输入十个正整数,把这十个数按由大到小的顺序排列(将数据按一定顺序排列称为
排序,排序的 算法有很多,其中选择排序中的

简单选择排序

是一种较简单的方法)

分析:

要把十个数按从大到小顺序排列,
则排完后,第一个数最大,
第二个数次大,
……

因此,我们第一步可将第一个数与 其后的各个数依次比较,若发现,比它大的,

则与之交
换,比较结束后,则第一个数 已是最大的数。同理,第二步,将第二个数与其后各个数再依
次比较,又可得出次大的数。如此方法进行 比较,
最后一次,


第九个数与第十个数比较,
以决定次小的数。于是十个数的顺序排列结束。


例如下面对
5
个进行排序,这个五个数分别为
8

2

9

10

5
。按选择排序方法,过程如
下:


初始数据


8

2

9

10

5

第一轮排序:
8

2

9

10

5

9

2

8

10

5

10

2

8

9

5

10

2

8

9

5

第二轮排序:
10

8

2

9

5

10

9

2

8

5

10

9

2

8

5

第三轮排序:
10

9

8

2

5

10

9

8

2

5

第四轮排序:
10

9

8

5

2

对于十个数,则排序要进行
9
次。源程序如下:


program ex5_2;

var

a:array[1..10]of integer;

i,j,t:integer;

begin

writeln('Input 10 integers:');

for i:=1 to 10 do read(a[i]);
{读入
10
个初始数据}


readln;

for i:=1 to 9 do
{进行
9
次排序}


begin

for j:=i+1 to 10 do
{将第
i
个数与其后所有数比较}


if a[i]{若有比
a[i]

,
则与之交换}


begin

t:=a[i];a[i]:=a[j];a[j]:=t;

end;

write(a[i]:5);

end;

end.




5

编程
输入十个正整数,然后自动按从大到小的顺序输出。
(冒泡排序 )

【问题分析】


①用循环把十个数输入到
A
数组中;

②从
A[1]

A[10]
,相邻的两个数两两相比较,即:

A[1]
A[2]
比,
A[2]

A[3]
比,……
A[9]< br>与
A[10]
比。

只需知道两个数中的前面那元素的标号,就能进行 与后一个序号元素(相邻数)比较,可写成通用形


A[ i ]

A[ i +1]
比较,那么,比较的次数又可用
1

( n - i )
循环进行控制

(
即循环次数与两两相比

较时前面那个元素序号有关
)


③在每次的比较中,若较大的数 在后面,就把前后两个对换,把较大的数调到前面,否则不需调换位

置。

下面例举
5
个数来说明两两相比较和交换位置的具体情形:

5 6 4 3 7 5

6
比较,交换位置,排成下行的顺序;

6 5 4 3 7 5

4
比较,不交换,维持同样的顺序;

6 5 4 3 7 4

3
比较,不交换,顺序不变

6 5 4 3 7 3

7
比较,交换位置,排成下行的顺序;

6 5 4 7 3
经过(
1
~(
5-1

)次比较后,将
3
调到了末尾。

经过第一轮的
1


(N-1)
次 比较,就能把十个数中的最小数调到最末尾位置,第二轮比较
1


(N-2)


进行同样处理,又把这一轮所比较的“最小数”调到所比较范 围的“最末尾”位置;……;每进行一轮两

两比较后,其下一轮的比较范围就减少一个。最后 一轮仅有一次比较。在比较过程中,每次都有一个“最

小数”往下“掉”
,用这种方法排列顺序,常被称之为“冒泡法”排序。

Program
Exam52;
const N=10;
Var a: array[1..N] of integer;
{定义数组}

i,j: integer;
procedure
Swap(Var x,y: integer);
{交换两数位置的过程}

Var t:integer;
begin

t:=x; x:=y; y:=t
end;
Begin

for i:=1 to N do
{输入十个数}

begin

Readln(a[ i ])
end;
for j:=1 to N-1 do
{冒泡法排序}

for i:=1 to N-j do {
两两相比较
}
if a[ i ] < a[i+1] then swap(a[ i ], a[i+1]); {
比较与交换
}
for i:=1 to N do
{输出排序后的十个数}

write(a[ i ]:6);
Readln
end.

例:读入5个学生的学号和成绩,计算他们的平均 分,若比平均分高10分的等第为
A
,若比平
均分高小于10分的等地为
B< br>,若低于平均分,则等第为
C
,输出他们的成绩和等第。


program sample7d1(input,output);


const n=5;


type



no=array[1..n] of integer;



s=array[1..n]of real;


var



i:integer;



k:real;



num:no;



score:s;

begin

严寒的反义词-一生所爱吉他谱


严寒的反义词-一生所爱吉他谱


严寒的反义词-一生所爱吉他谱


严寒的反义词-一生所爱吉他谱


严寒的反义词-一生所爱吉他谱


严寒的反义词-一生所爱吉他谱


严寒的反义词-一生所爱吉他谱


严寒的反义词-一生所爱吉他谱