判断素数

PAT 1007. 素数对猜想 python 运行超时问题解决方案

二次信任 提交于 2019-12-06 23:33:07
原问题 https://www.patest.cn/contests/pat-b-practise/1007 让我们定义 d n 为:d n = p n+1 - p n ,其中 p i 是第i个素数。显然有 d 1 =1 且对于n>1有 d n 是偶数。“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。 现给定任意正整数N (< 10 5 ),请计算不超过N的满足猜想的素数对的个数。 输入格式: 每个测试输入包含1个测试用例,给出正整数N。 输出格式: 每个测试用例的输出占一行,不超过N的满足猜想的素数对的个数。 输入样例: 20 输出样例: 4 思路非常简单,一个函数判断某个数是否为质数,主函数从5循环到正整数N即可,关键问题在于判断质数的函数效率如何 以下从低到高说几种质数判断方法(number为待判定的数): LEVEL 0. up_limit = number #以number本身作为循环上限 for i in range(2, up_limit) : #尝试从2到number-1的每一个数是否可以被number整除 if number % i == 0 : #余数为零则不是素数 return False return True LEVEL 0.5. up_limit = int( number/2) #不用多说吧,最小的除数是2,不可能有大于 number/2

PAT(Python)-1007:素数对猜想(20)

余生长醉 提交于 2019-12-06 23:32:48
让我们定义 d n 为:d n = p n+1 - p n ,其中 p i 是第i个素数。显然有 d 1 =1 且对于n>1有 d n 是偶数。“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。 现给定任意正整数N (< 10 5 ),请计算不超过N的满足猜想的素数对的个数。 输入格式: 每个测试输入包含1个测试用例,给出正整数N。 输出格式: 每个测试用例的输出占一行,不超过N的满足猜想的素数对的个数。 import math def prime(N): # 生成函数用来判断素数 for j in range(2,int(math.sqrt(N))+1,1): if N % j == 0: return False return True n = int(input()) li = [i for i in range(2, n+1) if prime(i) and prime(i+2) and (i+2<=n)] # 每组素数对都应该是素数且相差2,将满足条件的素数放入li print(len(li)) 来源: CSDN 作者: qilixuening 链接: https://blog.csdn.net/qilixuening/article/details/70162119

[PAT乙级]1007. 素数对猜想 (20)

爷,独闯天下 提交于 2019-12-06 23:32:38
1007. 素数对猜想 (20) 原题链接 让我们定义 dn 为:dn = pn+1 - pn,其中 pi 是第i个素数。显然有 d1=1 且对于n>1有 dn 是偶数。 “素数对猜想”认为“存在无穷多对相邻且差为2的素数”。 现给定任意正整数N (< 105),请计算不超过N的满足猜想的素数对的个数。 输入格式:每个测试输入包含1个测试用例,给出正整数N。 输出格式:每个测试用例的输出占一行,不超过N的满足猜想的素数对的个数。 输入样例: 20 输出样例: 4 注意: 第一次提交显示运行超时,判断素数时for循环里写的是j小于i,N很大时会显示运行超时 代码是双层for循环嵌套,时间复杂度(On^2) 改进后内部for循环条件为j*j<=i,当N很大时,减少很大一部分运行时间 代码: #include <iostream> using namespace std ; int main() { int N; cin >> N; int res = 0 ; int a= 2 ,b= 3 ; for ( int i= 5 ; i<=N; i++){ bool temp = true ; for ( int j= 2 ; j*j<=i; j++){ //j*j很重要,减少运行时间 if (i%j == 0 ){ temp = false ; break ; } } if (temp){

python3之1007.素数对猜想 (20分)

不想你离开。 提交于 2019-12-06 23:31:17
题目赘述如下: 让我们定义 dn 为:dn = pn+1 - pn,其中 pi 是第i个素数。显然有 d1=1 且对于n>1有 dn 是偶数。“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。 现给定任意正整数N (< 10^5),请计算不超过N的满足猜想的素数对的个数。 输入格式: 每个测试输入包含1个测试用例,给出正整数N。 输出格式: 每个测试用例的输出占一行,不超过N的满足猜想的素数对的个数。 输入样例: 20 输出样例: 4 题目解析: 题目仍然是不难理解,也不难写,素数的判断是编程基本功,然后判断i和i+2是否是素数对。 本题争议最大的地方乃最后一个测试点,暴力求解往往超时,需要简要优化算法,如下代码测试最后一个测试点用时222ms,效果还不错,可堪重用。 import math def sushu(num): # 判断素数的函数,注意传入的num已经全是奇数了,故从3开始判断每个奇数是否是因数 for i in range(3,int(math.sqrt(num))+1,2): if num % i == 0: return False return True if __name__ == '__main__': n = int(input()) con = 0 # 素数对计数 f1 = sushu(3) # f1和f2存入相邻两个数字的素数状态

1007 素数对猜想 Python实现

你说的曾经没有我的故事 提交于 2019-12-06 23:30:47
1007 素数对猜想(20 分) 让我们定义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 问题分析: 解题思路很简单,找出n以内的素数,再寻找相邻且差为二的素数对 在实现的过程中,遇到一个十分麻烦的问题,算法超出时间限制,优化方向当然是素数判断算法的优化。所以之后会着重讲解素数判断算法的优化(需要代码的同学直接拉到最后)。 素数判断算法一: 直接利用素数定义编写的算法: def prime(a): if a<=1: return False for i in range(2,a-1): if a%i==0: return False return True 利用该算法输出100000(十万)以内素数,程序以及运行时间如下: 程序: import time def prime(a): if a<=1: return False for i in range(2,a-1): if a%i==0: return

C语言I博客作业11

强颜欢笑 提交于 2019-12-06 16:34:52
问题 回答 这个作业属于哪个课程 C语言程序设计II 这个作业要求在哪里 https://edu.cnblogs.com/campus/zswxy/CST2019-2/homework/10096 我在这个课程的目标是 掌握并熟悉C语言的运用 这个作业在哪个具体方面帮助我实现目标 嵌套循环的运用 参考文献 《C primer Plus》《C语言程序设计》《CSDN》《百度》 1. PTA实验作业 1.1 输出三角形字符阵列 题目内容 本题要求编写程序,输出n行由大写字母A开始构成的三角形字符阵列。 输入格式: 输入在一行中给出一个正整数n(1≤n<7)。 输出格式: 输出n行由大写字母A开始构成的三角形字符阵列。格式见输出样例,其中每个字母后面都有一个空格。 1.1.1 数据处理 数据表达:定义整型变量n,b,c,字符型变量a='A',其中n表示行数,b,c表示循环变量,a表示每列每行的字母 数据处理:输入n表示有n行数,从第一行n列开始,每下一行依次递减直到最后n行只有一列,用两个for循环,第一个for循环得出行数,第二个for循环得出列数,从字母A开始一个一个的输出,列循环累加时,字符型变量字母累加然后输出,每一行输完跳出中间第二个for循环,以换行跳回第一个for循环 伪代码: 1.1.2 实验代码截图 1.1.3 造测试数据 输入数据 输出数据 说明 4 A B C D

筛法--求1到100的所有素数

纵然是瞬间 提交于 2019-12-06 15:06:16
用筛法求出100以内的全部素数,并按每行五个数显示 从1开始每次判断一个数是否为素数,如果为素数,就把所有能被这个数整除的数排除,即不是素数 首先是一个判断素数的函数 1 bool sushu(int x) 2 { 3 if (x==2) 4 return true; 5 for (int i = 2;i <= sqrt(x);i++) 6 { 7 if (x%i==0) 8 return false; 9 } 10 return true; 11 } 把能被素数整除得数排除 1 for (int i = 2;i <= sqrt(n);i++) 2 { 3 if (sushu(i)) 4 { 5 for (int j= 2;j <= n/i;j++) 6 { 7 a[i*j]=false; 8 } 9 } 10 } 完整代码: 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <math.h> 5 #include <algorithm> 6 #include <iomanip> 7 using namespace std; 8 bool sushu(int x) 9 { 10 if (x==2) 11 return true; 12 for (int i = 2;i <= sqrt

求100以内的素数(质数)算法梳理

和自甴很熟 提交于 2019-12-06 11:13:36
质数定理: 1、从2开始到自身的-1的数中找到一个能整除的(从2开始到自身开平方的数中找到一个能整除的)。 2、一个合数一定可以分解成几个质数的乘积,也就是说,一个数如果能被一个质数整除就是合数。(使用列表保存质数) 使用定理1的基本写法: (1) n = 100 for i in range(2, n): for j in range(2, i): if i % j == 0: break else: print(i, end=' ') 这种基本写法效率不高,有2点可以改进的地方: 1、第一层循环的i取值时,因为偶数确定不是质数,所以排除偶数,使用range()函数排除偶数,range(3, n, 2)这样就减少了一半的数。 2、第二层循环j取值时,考虑从2开始到i开平方取值,同时也把偶数排除range(3, int(i**0.5)+1, 2)这样也可减少一半的数。2就是质数,单独打印。 (2)改进(1) n = 100 print(2) for i in range(3, n, 2): for j in range(3, int(i**0.5)+1, 2): if i % j == 0: break else: print(i, end=' ') (3)再(2)的基础上还有优化的点,发现第一层循环i取值时,当i>10时,5的倍数也可排除 n = 100 print(2) for

统计两个整数之间有多少个素数

夙愿已清 提交于 2019-12-06 06:43:17
def demo(x): def inner(num): if num <= 2: #1,2都是素数 result = '是素数' else: num >2 #我们主要是判断>2的数 for i in range(2,num): if num%i == 0: result = 0 #在此判断为非素数 break elif num%i == 1: result = 1 #再此判断为素数 return x(result) return inner@demodef func(p): return pnum1 = int(input('请输入一个数字:\n'))num2 = int(input('请输入一个数字:\n'))a = 0b = 0for i in range(num1,num2+1): func(i) if func(i) == 0: a += 1 else: b += 1print('2到100中非素数有{}个'.format(a))print('2到100中素数有{}个'.format(b)) 来源: https://www.cnblogs.com/ldmb/p/11966217.html

C/C++程序训练6---歌德巴赫猜想的证明

寵の児 提交于 2019-12-05 15:11:27
问题:验证“每个不小于6的偶数都是两个素数之和”,输入一个不小于6的偶数n,找出两个素数,使它们的和为n。 使用语言:C. 输入:输入一个不小于6的偶数n。 输出:找出两个素数,使它们的和为n。只需要输出其中第一个素数最小的一组数据即可。 例: 输入 80 输出 80=7+73 #include <stdio.h> int f(int m) { int i; for(i=2;i<m;i++)//从2开始循环,以保证第一个素数是符合条件的最小素数。 { if(m%i==0) break; } if(i==m)//当为素数时,必有i=m,这时用if直接设置返回值。 { return -1; } else { return 1; } }//定义一个判断“m”是不是素数的函数。 int main() { int n; int i=3; scanf("%d",&n); for ( i=3;i<n;i++) { if(f(i)==-1&&i%2==1&&f(n-i)==-1&&(n-i)%2==1) { printf("%d=%d+%d\n",n,i,n-i); break; } } } 来源: https://www.cnblogs.com/ciarian/p/11930074.html