用筛法求100以内的素数

合集下载

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

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

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

【问题分析】⑴把2到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;BeginFillchar(a,sizeof(a),true);a[1] := False;for i:=2 to Trunc(sqrt(N)) doif a[I] thenfor j := 2 to N div I doa[I*j]:= False;t:=0;for i:=2 to N doif a[i] thenBeginwrite(a[ i ]:5); inc(t);if t mod 5=0 then writelnend;End.【例3】输入十个正整数,把这十个数按由大到小的顺序排列(将数据按一定顺序排列称为排序,排序的算法有很多,其中选择排序中的“简单选择排序”是一种较简单的方法)分析:要把十个数按从大到小顺序排列,则排完后,第一个数最大,第二个数次大,……;因此,我们第一步可将第一个数与其后的各个数依次比较,若发现,比它大的,则与之交换,比较结束后,则第一个数已是最大的数。

一维数组习题

一维数组习题

一维数组【例1】输入50个数,要求程序按输入时的逆序把这50个数打印出来;也就是说,请你按输入相反顺序打印这50个数分析:我们可定义一个数组a用以存放输入的50个数,然后将数组a内容逆序输出,源程序如下program ex5_1;typearr=array[1..50]of integer; {说明一数组类型arr}vara:arr;i:integer;beginwriteln('Enter 50 integer:');for i:=1 to 50 do read(a[i]);{从键盘上输入50个整数}readln;for i:=50 downto 1 do {逆序输出这50个数}write(a[i]:10);end.【例2】输入十个正整数,把这十个数按由大到小的顺序排列(将数据按一定顺序排列称为排序,排序的算法有很多,其中选择排序中的―简单选择排序‖是一种较简单的方法)分析:要把十个数按从大到小顺序排列,则排完后,第一个数最大,第二个数次大,……;因此,我们第一步可将第一个数与其后的各个数依次比较,若发现,比它大的,则与之交换,比较结束后,则第一个数已是最大的数。

同理,第二步,将第二个数与其后各个数再依次比较,又可得出次大的数。

如此方法进行比较,最后一次,将第九个数与第十个数比较,以决定次小的数。

于是十个数的顺序排列结束。

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

按选择排序方法,过程如下:初始数据:82910 5第一轮排序:82910 592810 510289 510289 5第二轮排序:10829 510928 510928 5第三轮排序:10982 510982 5第四轮排序:10985 2对于十个数,则排序要进行9次。

源程序如下:program ex5_2;vara:array[1..10]of integer;i,j,t:integer;beginwriteln('Input 10 integers:');for i:=1 to 10 do read(a[i]);{读入10个初始数据}readln;for i:=1 to 9 do{进行9次排序}beginfor j:=i+1 to 10 do{将第i个数与其后所有数比较}if a[i]<a[j] then {若有比a[i]大,则与之交换}begint:=a[i];a[i]:=a[j];a[j]:=t;end;write(a[i]:5);end;end.【例3】从键盘输入10个数,将这10个数逆序输入,并求这10个数的和,输出这个和。

埃塞法求素数

埃塞法求素数

埃塞法求素数什么是素数?素数是指大于1且只能被1和自身整除的整数。

例如,2、3、5、7、11等都是素数,而4、6、8、9等则不是素数。

素数在数论中具有重要的地位,它们的特殊性质使得它们在密码学、计算机科学等领域有广泛的应用。

埃塞法(筛法)是什么?埃塞法,又称筛法,是一种用于求解素数的算法。

它的基本思想是通过逐步筛除合数的方法,找出一定范围内的所有素数。

埃塞法的步骤1.首先,我们需要确定一个范围,假设为n。

2.创建一个长度为n+1的布尔数组,初始值都为True。

这个数组用来表示数字是否为素数,索引对应的数字为素数则对应的值为True,否则为False。

3.从2开始,将数组中索引为2的倍数的值设置为False,因为2的倍数肯定不是素数。

4.接下来,找到第一个为True的索引值,假设为p,这个值就是我们找到的第一个素数。

5.然后,将数组中索引为p的倍数的值设置为False,因为p的倍数肯定不是素数。

6.重复步骤4和5,直到找不到下一个为True的索引值。

7.最后,数组中为True的索引值就是范围内的所有素数。

一个简单的埃塞法求素数的实现(Python)下面是一个简单的Python代码示例,用于实现埃塞法求素数:def sieve_of_eratosthenes(n):primes = [True] * (n+1)primes[0] = primes[1] = Falsep = 2while p * p <= n:if primes[p]:for i in range(p * p, n+1, p):primes[i] = Falsep += 1result = []for i in range(2, n+1):if primes[i]:result.append(i)return resultn = int(input("请输入一个正整数n:"))primes = sieve_of_eratosthenes(n)print("范围内的素数有:", primes)示例说明在上述示例中,我们首先定义了一个名为sieve_of_eratosthenes的函数,它接受一个正整数n作为参数,返回范围内的所有素数。

C 使用筛选法求100以内的素数

C 使用筛选法求100以内的素数

C 使用筛选法求100以内的素数C++使用筛选法求100以内的素数,具体问题分析及其代码如下:【问题分析】我们可以把100个数看作是沙子和石子,素数是石子,非素数的是沙子,弄个筛子,将沙子筛掉,剩下的就是素数。

1至100这些自然数可以分为三类:(1) 单位数:仅有一个数1.(2) 素数:这个数大于1,且只有它本身和1这样两个正因数。

(3) 合数:除了1和他自身以外,还有其他的正因数。

【代码如下】/********************************************************/* 程序名:素数筛选/* 编程时间:2009年7月27日/* 主要功能:求素数*********************************************************/#include<iostream>using namespace std;//编译命令#include<math.h>const int MAX=100;//定义常量MAXint main()//主函数{int prime[MAX+100]={0};//定义变量并初始化int i,j,k=sqrt(MAX);for(i=2; i<=k; i++)//枚举筛数{if(prime[i]==0)//如果这个数没被筛,就看看{j=i*2;//将原数扩大二倍初始化给jdo{prime[j]=1;//将j筛掉j+=i; //再扩大一倍}while(j<=MAX);//直到最大}}for(i=2; i<=MAX; i++){if(prime[i]==0)//循环输出cout<<i<<" ";}cout<<endl;return 0;//主函数结束}【运行结果】。

素数快速筛法及公式

素数快速筛法及公式

素数快速筛法及公式素数快速筛法及公式梅生林安徽合肥2012.07.12摘要:在素数的研究中,总结出素数快速筛法及公式,在这个基础上扩展了素数的一些关系、性质。

关键词:素数快速筛法,素数通式,质数筛法公式1.引言素数(Prime Number)是指自然数中那些只能被1和本身整除的数,依次为2、3、5、7、11、13、17、19、23、29…。

前人已证明:素数有无限多个。

一直到现在人们判定、寻找素数的方法,还是古希腊的数学家艾拉托斯芬(Eratosthenes)提出过的筛式方法,简称“艾氏筛法”。

即在任意有限自然数N以内判定素数时,先把N一个不漏的写下来,然后划掉根号N()内所有素数的倍数,我们就能得到N以内的全部素数。

艾氏筛法判定素数的过程机械,也未能表示素数公式和一些性质。

关于寻找判定表示素数的方法公式,以前众多数学家进行了艰辛探索,也提出了很多关于素数的猜想和问题。

欧拉(Euler)就提出二项式公式n2-n+41能生成一部分素数的数型公式,直到现在,素数研究中仍然还有许多未解问题。

本文通过素数快速筛法及公式,总结出一些素数的新理论,使素数筛法及公式等都将是一次质变,将为素数研究抛砖引玉,也可能为数论增添上新的一页。

2.素数的快速筛法原理及公式当我们用艾氏筛法是要划掉每个合数,只2的倍数就差不多要划掉一半自然数,越往后面合数越多,而留下的素数越少。

我们能不能利用数学原理、公式去掉大部分合数呢?答案是肯定的。

2.1 当我们想去掉第一个素数2的倍数时,我们可能会想到用:2N+1 (N≥1)N为大于等于1的自然数,以下公式同上。

2.2 去掉2、3的倍数时,用2*3的倍数加上同为2、3互质的数:6N±12.3 去掉2、3、5的倍数时,用2*3*5的倍数加上同为2、3、5互质的数:30N±1,30N±7,30N±11,30N±13,2.4 去掉2、3、5、7的倍数时,同上的方法:210N±1,210N±11,210N±13,210N±17,210N±19,210N±23,210N±29,210N±31,210N±37,210N±41,210N±43,210N±47,210N±53,210N±59,210N±61,210N±67,210N±71,210N±73,210N±79,210N±83,210N±89,210N±97,210N±101,210N±103,2.5 去掉2、3、5、7、11的倍数时,同上的方法:2310N±1,2310N±13,2310N±17,2310N±19,……2310N±1139,2310N±1147,2310N±1151,2310N±1153,我们可以一直做下去,就会去掉从前面开始的素数倍数,划掉的合数比例将越来越少。

用筛法求100以内的素数

用筛法求100以内的素数

1. 用筛法求100以内的素数。

算法:先将1~100放置于一个一维数组中,然后依次判断每个数是否素数,若不是素数将该元素置0,最后输出不为0的数。

如何判断一个数是否素数?素数定义是只能被1和本身整除的数,设置除数n=2~a[i]-1特殊的两个数1、2,不需要判断定义变量:int a[100],i,n;输入数据:循环赋值,for(i=0;i<100;i++) a[i]=i+1;处理:双重循环,外层循环控制访问数组元素,内层循环控制除数的变化for(i=2;i<100;i++) for(n=2;n<=a[i]/2;n++) if(a[i]%n==0) a[i]=0;输出:for(i=0;i<100;i++)if(a[i]!=0) printf(“%3d”,a[i]);2. 编写一个程序,计算若干学生的某门功课的平均成绩、标准差,找出最高分和最低分。

算法:循环输入成绩,需要求和,然后求平均成绩;循环sqrt(求和(xi-aver)*(xi-aver))定义变量:float grade[N],max,min,aver,bzc,sum;int i;输入数据:for(i=0;i<N;i++) scanf(“%f”,&grade[i]);处理:sum=0; max=min=grade[0];for(i=0;i<N;i++) {sum=sum+grade[i];if(max<grade[i]) max=grade[i]; if(min>grade[i]) min=grade[i];}aver=sum/N;sum=0; for(i=0;i<N;i++) sum=sum+(grade[i]-aver)* (grade[i]-aver);bzc=sqrt(sum/N);输出结果3.编写一个程序,让计算机产生20个随机数,用选择法排序。

98 36 54 18 65 23 48 78 84 8for(i=0;i<N-1;i++){p=i;for(j=i+1;j<N;j++) if(a[p]>a[j]) p=j;if(p!=i) { t=a[p];a[p]=a[i];a[i]=t;}}设置一个变量p,去记住最小值的下标,4. 根据上题的内容1,编一程序在数组中查找一个数。

第七章C语言谭浩强答案

第七章C语言谭浩强答案

7.1用筛法求100之内的素数。

解:所谓“筛法”指的是“Eratosthenes筛法”。

Eratosthenes是古希腊的著名数学家。

他采用的方法是:在一张纸上写下1~1000之间的全部整数,然后逐个判断它们是否素数,找出一个非素数就把它挖掉,最后剩下的就是素数。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 2728 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 …具体做法如下:先将1挖掉(因为1不是素数)。

用2去除它后面的各个数,把能被2整除的数(如4,6,8…)挖掉,即把2的倍数挖掉。

用3去除它后面各数,把3的倍数挖掉。

分别用4,5…各数作为除数去除这些数以后的各数。

这个过程一直进行到在除数后面的数已全被挖掉为止。

例如在上表中1~50范围内的素数,要一直进行到除数为47为止。

事实上,这一过程可以简化。

如果需要找1~n数)即可。

例如对1~50,只需进行到将7上面的算法可表示为:挖去1;用刚才被挖去的数的下一个数p去除p后面的各数,把p的倍数挖掉;检查p n=1000,则检查p<31否),如果是,则返回(2)继续执行,否则就结束;纸上剩下的就是素数。

解题的基本思路有了,但要变成计算机的操作,还要作进一步的分析。

如怎样判断一个数是否已被“挖掉”,怎样找出某一个数p的倍数,怎样打印出未被挖掉的数。

可以设一个数组a,a[1]到a[100]的值分别是1,2,3,…100。

然后用上述方法将非素数“挖去”。

如果一个数被认为是非素数,就将它的值变为零,最后将不为零的数组元素输出,就是所求的素数表。

程序如下:#include <math.h>main ( ){int i,j,n,a[101];for (i=1;i<=100;i++)a[i] =i;for (i=2;i<sqrt(100);i++)for (j=i+1;j<=100;j++){if (a[i]!=0 && a[j]!=0)if (a[j]%a[i]==0)a[j]=0; } /*非素数,赋值为0,“挖掉”*/printf(“\n”);for (i=2,n=0;i<=100;i++){ if (a[i]!=0){printf(“%5d”,a[i]);n++; }if (n==10) /*此处if 语句的作用是在输出10个数后换行*/{ printf (“\n”);n=0; }}}运行结果:2 3 5 7 11 13 17 19 23 29 31 37 41 4347 53 59 61 67 71 73 79 83 89 977.2用选择法对10个整数排序(从小到大)。

C语言程序设计习题库答案

C语言程序设计习题库答案

C 语言程序设计(第三版)习题库1、设圆半径r=,圆柱高h=3,求圆周长、圆面积、圆球表面积、圆球体积、圆柱体积。

用scanf 输入数据,输出计算结果,输出时要求文字说明,取小数点后两位数字。

请编程序。

#include <>main(){float r,h,C1,Sa,Sb,Va,Vb;scanf(__”%f ”__,&r);scanf(”%d ”,__&h_);;C1=2**r;Sa=*r*r;Sb=4*Sa;Va=4**r*r*r/3;Vb=Sa*h;printf(___”Cl=%.2fSa=%.2fSb=%.2fVa=%.2fVb=%.2f ”,Cl,Sa,Sb,Va,Vb);}2、输入一个华氏温度,要求输出摄氏温度。

公式为 c=5(F-32)/9输出要求有文字说明,取位2小数。

#include <>main(){float F,c;scanf("%f",&F);____c=5*(F-32)/9______;printf("c=%.2f",c);}3、有一函数:⎪⎩⎪⎨⎧≥-<≤-<=10113101121x x x x x x y 写一程序,输入x 值,输出y 值。

#include <>main(){int x,y;printf("输入x :");scanf("%d",&x);if(x<1) { /* x<1 */y=x;printf("x=%3d, y=x=%d\n",x,y);} else if (____x<10_______){ /* 1≤x -10 */_____y=2*x-1_______;printf("x=%3d, y=2*x-1=%d\n",x,y);} else{ /* x≥10 */y=3*x-11;printf("x=%3d, y=3*x-11=%d\n",x# include ""main(){scanf("%d",&x);if(x<1){ y=x;}else if(x>=1 && x<10){ y=2*x-1;}else{ y=3*x-11;}printf("%d",y);}# include ""main(){int x,y;scanf("%d",&x);if(x<1){ y=x;}else if(x>=1 && x<10){ y=2*x-1;}else{ y=3*x-11;}printf("%d\n",y);}# include ""main(){int x,y;scanf("%d",&x);if(x<1){ y=x;}else if(x>=1 && x<10){ y=2*x-1;}else{ y=3*x-11;}printf("%d",y);}scanf("%d",&x);if(x<1){ y=x;}else if(x>=1 && x<10){ y=2*x-1;}else{ y=3*x-11;} # include "" main(){int x,y;scanf("%d",&x);y=x;else if(x>=1 && x<10)y=2*x-1;elsey=3*x-11;printf("%d",y);},y);}}4、给定一个不多于5位的正整数,要求:①求它是几位数;②按逆序打印出各位数字。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档