用筛选法求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且只能被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;//主函数结束}【运行结果】。

筛选法求素数c语言

筛选法求素数c语言

筛选法求素数c语言一、什么是素数?素数,又称质数,是指在大于1的自然数中,除了1和它本身以外,不能被其他自然数整除的数。

比如2、3、5、7、11等都是素数。

二、为什么要求素数?在计算机科学中,素数有着重要的应用。

比如在加密算法中,RSA算法就是基于大质数的分解来实现加密和解密的。

此外,在计算机图形学中也常常用到素数。

三、筛选法求素数筛选法求素数是一种简单而有效的方法。

它的基本思想是:先把从2开始的各个自然数列出来,然后按照从小到大的顺序对每个未标记过的最小质数p进行标记,并把p的倍数标记成合数。

重复这个过程直到所有数字都被标记。

具体实现上可以使用一个布尔数组isPrime[]来表示每个数字是否为质数。

初始时将所有元素赋值为true(即都认为是质数),然后从2开始遍历数组,如果当前元素isPrime[i]为true,则说明i是一个质数,并将i的倍数isPrime[i*j](j=2,3,4...)全部标记成false(即合数)。

这样遍历完整个数组后,isPrime[]为true的元素就是所有的质数。

四、C语言代码实现下面是一个基于筛选法求素数的C语言代码实现:```c#include <stdio.h>#include <stdlib.h>#include <stdbool.h>void sieveOfEratosthenes(int n) {bool isPrime[n+1];for (int i = 2; i <= n; i++) {isPrime[i] = true;}for (int i = 2; i*i <= n; i++) {if (isPrime[i]) {for (int j = i*i; j <= n; j += i) {isPrime[j] = false;}}}printf("The prime numbers between 2 and %d are:\n", n);for (int i = 2; i <= n; i++) {if (isPrime[i]) {printf("%d ", i);}}}int main() {int n;printf("Enter a number: ");scanf("%d", &n);sieveOfEratosthenes(n);return 0;}```五、代码解析首先定义了一个函数sieveOfEratosthenes,它的参数n表示要求解的范围。

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

例6、用筛法求出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(类型名)}V ar 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】输入十个正整数,把这十个数按由大到小的顺序排列(将数据按一定顺序排列称为排序,排序的算法有很多,其中选择排序中的“简单选择排序”是一种较简单的方法)分析:要把十个数按从大到小顺序排列,则排完后,第一个数最大,第二个数次大,……;因此,我们第一步可将第一个数与其后的各个数依次比较,若发现,比它大的,则与之交换,比较结束后,则第一个数已是最大的数。

素数快速筛法及公式

素数快速筛法及公式

素数快速筛法及公式素数快速筛法及公式梅生林安徽合肥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,编一程序在数组中查找一个数。

谭浩强教材习题选

谭浩强教材习题选

1)要将“China”译成密码,密码规律是:用原来的字母后面第4个字母替原来的字母。

例如,字母“A”后面第4个字母是“E”,用“E”代替“A”。

因此,“China”应译为“Glmre”。

请编一程序,用赋初值的方法使c1、c2、c3、c4、c5五个变量的值分别为‘C’,‘h’、‘i’、‘n’、‘a’,经过运算,使分别变为‘G’,‘l’,‘m’,‘r’、‘e’,并输出。

2)给出一百分制成绩,要求输出成绩等级‘A’、‘B’、‘C’、‘D’、‘E’,90分以上为‘A’,80—89分为‘B’,70—79分为‘B’,60—69分为‘B’,60分以下为‘E’3)给出一个不多于5位的正整数,要求:1、求出它是几位数;2、分别打印出每一位数字;3、按逆序打印出个位数字,例如原数是321,应输出123。

4)输入4个整数,要求按由小到大的顺序输出。

5)企业发放的奖金根据利润提成。

数组6)用筛选法求100之内的素数7)用选择法对10个整数排序8)求一个3*3的整型矩形对角线元素之和9)已有一个已排好序的数组,今输入一个数,要求按原来排序的规律将它插入数组中10)将一个数组中的值按逆序重新存放。

11)打印魔方阵。

行,列,对角线和相等12)找出一个二维数组的鞍点,该行最大,该列最小,也可能没有。

13)有15个数按由大到小存放,用折半法找出该数是数组中第几个元素的值。

14)电文加密15)字符串连接16)字符串比较17)字符串拷贝函数18)写两个函数,分别求两个整数的最大公约数和最小公倍数19)写一个判素数的函数20)写一个函数,使一个给定的二维数组行列互换21)写一个函数,使字符串反序存放,在主函数中输入输出22)写一函数,将一个字符串中元音字母复制到另一字符串23)写一函数,输入一个4位数字,要求输出4个数字字符,但要求数字间空一个空格24)编写一个函数,统计参数字符串中字母、数字、空格和其他字符的个数25)写一个函数,输入一行字符,将此字符串最长的单词输出26)写一函数,用起泡法对10个字符排序27)输入10个学生5门课的成绩,分别用函数求:每个学生的平均分,每门课的平均分,找出最高分数对应的学生和课程,28)写几个函数,输入10个职工的姓名和职工号,按职工号从大到小的顺序排序,姓名顺序也随着调整;用折半法查找输入的一个职工号,输出该职工姓名。

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