素数

《程序设计基础与实验》期末考试第2场2018-2019学年第一学期

核能气质少年 提交于 2020-02-24 11:02:06
《程序设计基础与实验》期末考试第2场2018-2019学年第一学期 这里收集了我当时的期末考卷,这里包括程序填空题、函数题和编程题。大家可以看看当做复习练习用。 想看选择判断的请进 《程序设计基础与实验》期末考试第1场2018-2019学年第一学期 程序填空题: 5-1 数学家希尔伯特在1900年国际数学家大会的报告上提出一个“孪生素数猜想”,即:存在无穷多个素数p,使得p + 2也是素数。p和p+2这一对差为2的素数,被称为“孪生素数”。看起来,这个猜想是成立的,我们总能找到很多对孪生素数,例如:3和5, 5和7, 11和13…… 但这一猜想至今还未被证明。下面这段程序对于输入的整数n,寻找大于n的最小的一对孪生素数p和q(q=p+2)。根据所提供的运行示例,将程序补充完整。 运行示例如下: 输入示例1: 1 输出示例1: 3 5 输入示例2: 5 输出示例2: 11 13 #include <stdio.h> #include <math.h> int isPrime(int num) { if(num==1) return 0; for(int i=2; i<=sqrt(num); i++) if( num%i==0(2分) ) return 0; return 1; } int main(void) { int n; scanf("%d",&n); if(n<3)

1013 数素数

大城市里の小女人 提交于 2020-02-24 07:53:33
1013 数素数 令 P​i​​ 表示第 i 个素数。现任给两个正整数 M≤N≤10^​4​​,请输出 P​M​​ 到 P​N​​ 的所有素数。 输入格式: 输入在一行中给出 M 和 N,其间以空格分隔。 输出格式: 输出从 P​M​​ 到 P​N​​ 的所有素数,每 10 个数字占 1 行,其间以空格分隔,但行末不得有多余空格。 输入样例: 5 27 输出样例: 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 101 103 最后总是卡在19分,其实是因为第10000个素数是多少,是否在你写出的范围之内,所以总是卡在19分。改了之后就好了。 # include <stdio.h> int main ( ) { int m , n , i , j , h = 1 ; int a [ 10000 ] ; scanf ( "%d %d" , & m , & n ) ; for ( i = 1 ; i <= 104729 ; i ++ ) { for ( j = 2 ; j <= sqrt ( i ) ; j ++ ) { if ( i % j == 0 ) break ; } if ( j > sqrt ( i ) ) { a [ h ] = i ; h ++ ; } } j = 0 ; for ( i =

验证哥德巴赫猜想(函数专题)

余生颓废 提交于 2020-02-24 07:47:09
题目描述 哥德巴赫猜想大家都知道一点吧。我们现在不是想证明这个结论,而是对于任给的一个不小于6的偶数,来寻找和等于该偶数的所有素数对。做好了这件实事,就能说明这个猜想是成立的。 要求程序定义一个prime()函数和一个main()函数,prime()函数判断一个整数n是否是素数,其余功能在main()函数中实现。 int prime(int n) { //判断n是否为素数, 若n为素数,本函数返回1,否则返回0 } 输入 一个偶数M (M是6到1000000之间的一个偶数). 输出 输出和等于该偶数的所有素数对a和b,按a递增的顺序输出,(a,b)和(b,a)被视为同一个素数对。 样例输入 40 样例输出 3 37 11 29 17 23 # include <stdio.h> # include <math.h> int prime ( int a ) { int b = 2 , flag = 1 ; do { if ( a % b == 0 ) { flag = 0 ; break ; } b ++ ; } while ( b <= sqrt ( a ) ) ; //该方法可以避免2与3的存在 return flag ; //判断素数 } int main ( ) { int a , b , c , d , e , g ; scanf ( "%d" , & a ) ; for

素数筛专题精讲

自作多情 提交于 2020-02-23 22:52:18
素数筛 筛法的思想是去除要求范围内所有的合数,剩下的就是素数 了,而任何合数都可以表示为素数的乘积,因此如果已知一 个数为素数,则它的倍数都为合数。 事前需知: 1.sizeof和strlen的区别 strlen计算字符串的长度,以’\0’为字符串结束标志 sizeof是分配的数组实际所占的内存空间大小,不受里面存储内容 2.每种类型的变量都有各自的初始化方法,memset() 函数可以说是初始化内存的“万能函数”,通常为新申请的内存进行初始化工作。它是直接操作内存空间,mem即“内存”(memory)的意思。该函数的原型为: # include <string.h> void * memset ( void * s , int c , unsigned long n ) ; memset() 函数函数的功能是:将指针变量 s 所指向的前 n 字节的内存单元用一个“整数” c 替换,注意 c 是 int 型。s 是 void* 型的指针变量,所以它可以为任何类型的数据进行初始化。 一.复杂度:nlogn long long su [ max ] , cnt ; bool isprime [ max ] ; void prime ( ) { cnt = 1 ; memset ( isprime , 1 , sizeof ( isprime ) ) ; //初始化认为所以数都是素数

筛法求素数的几个模板

て烟熏妆下的殇ゞ 提交于 2020-02-23 11:23:17
定义法 素数可以由定义法求出,即遍历2到sqrt(x)中是否存在能整除x的数,如果存在则不是素数,如果不存在,则是素数,复杂度是O(n)。在数据量小的时候可以使用。 bool isprime(int x) // 判断素数 { if ( x<=1 ) return false; for (int i = 2; i*i<=x; i++) if (x%i==0) return false; return true; } 一般线性筛法 当数量级变大时,如果要找出某个范围内的素数,那么时间复杂度很容易过不去。因此考虑这样一个命题: 若一个数不是素数,则必然存在一个小于它的素数作为其因数。 该命题很容易证明其正确性 所以我们假设已经获得小于一个数x的所有素数,那么判断时就只需要看x是否能被这些素数整除,来判断x是不是素数。 但这样依然需要大量的枚举测试工作,因此换一个角度:当获得一个素数时,即将他所有的倍数均标记为非素数。这样一来,遍历是,如果这个数没有被标记,就说明它就无法被小于它的书整除,则可以认定为素数。 #define MAXSIZE 10001 int Mark[MAXSIZE]; int prime[MAXSIZE]; //判断是否是一个素数 Mark 标记数组 index 素数个数 int Prime(){ int index = 0; memset(Mark,0,sizeof

郑州轻工业大学OJ python1092: 素数表(函数专题)

好久不见. 提交于 2020-02-22 18:54:19
1092: 素数表(函数专题) 题目描述 输入两个正整数m和n,输出m和n之间的所有素数。 要求程序定义一个prime()函数和一个main()函数,prime()函数判断一个整数n是否是素数,其余功能在main()函数中实现。 int prime(int n) { //判断n是否为素数, 若n为素数,本函数返回1,否则返回0 } 对于C/C++代码的提交,本题要求必须通过定义prime函数和main函数实现,否则,提交编译错误,要提交完整的程序。 输入 输入两个正整数m和n,m<=n,且都在int范围内。 输出 输出占一行。输出m和n之间的所有素数,每个数后有一个空格。测试数据保证m到n之间一定有素数。 样例输入 2 6 样例输出 2 3 5 def prime ( i ) : m = i if m == 1 : return 0 k = m ** 0.5 k = int ( k ) for i in range ( 2 , k + 1 ) : if m % i == 0 : return 0 return 1 m , n = map ( int , input ( ) . split ( ) ) for i in range ( m , n + 1 ) : if prime ( i ) != 0 : print ( "%d" % i , end = ' ' ) 来源: CSDN

1007 素数对猜想

ⅰ亾dé卋堺 提交于 2020-02-21 03:22:01
素数对猜想 让我们定义d​n​​为:d​n​​=p​n+1​​−p​n​​,其中p​i​​是第i个素数。显然有d​1​​=1,且对于n>1有d​n​​是偶数。“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。 现给定任意正整数N(<10​5​​),请计算不超过N的满足猜想的素数对的个数。 输入格式: 输入在一行给出正整数N。 输出格式: 在一行中输出不超过N的满足猜想的素数对的个数。 输入样例: 20 输出样例: 4 # include <stdio.h> int main ( ) { int i , j , n , flag = 0 , h = 1 , shu = 0 ; int a [ 10000 ] ; scanf ( "%d" , & n ) ; for ( i = 2 ; i <= n ; i ++ ) { for ( j = 2 ; j <= sqrt ( i ) ; j ++ ) { if ( i % j == 0 ) break ; } if ( j > sqrt ( i ) ) { a [ h ] = i ; h ++ ; } } for ( i = 1 ; i < h ; i ++ ) { if ( ( a [ i + 1 ] - a [ i ] ) == 2 ) { shu ++ ; } } printf ( "%d" , shu ) ; }

查找素数

人盡茶涼 提交于 2020-02-19 07:24:58
转载 素数的定义很简单,如果一个数如果只能被 1 和它本身整除,那么这个数就是素数。 不要觉得素数的定义简单,恐怕没多少人真的能把素数相关的算法写得高效。比如让你写这样一个函数: // 返回区间 [2, n) 中有几个素数 int countPrimes ( int n ) // 比如 countPrimes(10) 返回 4 // 因为 2,3,5,7 是素数 你会如何写这个函数?我想大家应该会这样写: int countPrimes ( int n ) { int count = 0 ; for ( int i = 2 ; i < n ; i ++ ) if ( isPrim ( i ) ) count ++ ; return count ; } // 判断整数 n 是否是素数 boolean isPrime ( int n ) { for ( int i = 2 ; i < n ; i ++ ) if ( n % i == 0 ) // 有其他整除因子 return false ; return true ; } 这样写的话时间复杂度 O(n^2),问题很大。首先你用 isPrime 函数来辅助的思路就不够高效;而且就算你要用 isPrime 函数,这样写算法也是存在计算冗余的。 先来简单说下如果你要判断一个数是不是素数,应该如何写算法。只需稍微修改一下上面的 isPrim

L1-028 判断素数 (10分)

99封情书 提交于 2020-02-18 05:46:22
本题的目标很简单,就是判断一个给定的正整数是否素数。 输入格式: 输入在第一行给出一个正整数N(≤ 10),随后N行,每行给出一个小于2 ​31 ​​ 的需要判断的正整数。 输出格式: 对每个需要判断的正整数,如果它是素数,则在一行中输出Yes,否则输出No。 输入样例: 2 11 111 输出样例: Yes No 题目链接: https://pintia.cn/problem-sets/994805046380707840/problems/994805106325700608 判断是否为素数,只需要判断到一个数的平方根即可,否则会超时。 解题代码: # include <stdio.h> # include <math.h> int prime ( int n ) { int k ; if ( n == 1 ) return 0 ; k = ( int ) sqrt ( n ) ; for ( int i = 2 ; i <= k ; i ++ ) { if ( n % i == 0 ) return 0 ; } return 1 ; } int main ( ) { int T , x ; scanf ( "%d" , & T ) ; for ( int i = 1 ; i <= T ; i ++ ) { scanf ( "%d" , & x ) ; if ( prime (

航电OJ C语言-实验6

二次信任 提交于 2020-02-17 22:42:25
1. (20分) 6.2 写一个判断素数的函数,在主函数中输出1~100间的素数信息 输入描述 无 输出描述 输出1~100之间所有的素数,中间用空格隔开 输入样例 无 输出样例 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 用户代码 # include <stdio.h> int main ( ) { int i , j , k ; for ( i = 1 ; i <= 100 ; i ++ ) { k = 0 ; for ( j = 1 ; j <= i ; j ++ ) { if ( i % j == 0 ) k ++ ; } if ( k == 2 ) printf ( "%d " , i ) ; } return 0 ; } 最后保存时间: 2019-11-27 10:56:26 本题得分:20分(1/1) 查看最新评判结果 2. (20分) 6.3 设a,b,c为三个大于零的正整数,计算并输出下列不定方程组解的个数Number以及满足此条件的所有a,b,c之和sum。 题目描述 设a,b,c为三个大于零的正整数,计算并输出下列不定方程组解的个数Number以及满足此条件的所有a,b,c之和sum。 不定方程组为:(1) a+b+c=13 (2)a-c=5,且(a,b,c>0)