一 问题描述-素数对

  让我们定义素数差d​n​​为:dn​​=pn+1​​pn​​,其中p​i​​是第i个素数。显然有d​1​​=1,且对于n>1有d​n​​是偶数。“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。

   现给定任意正整数N(<),请计算不超过N的满足猜想的素数对的个数。

   输入格式: 输入在一行给出正整数N

   输出格式: 在一行中输出不超过N的满足猜想的素数对的个数。

   输入样例: 20

   输出样例: 4

二 求解思路

   求解出1到N范围内的素数,然后遍历此序列统计相邻素数差为2的素数对个数,重点在于判断素数的方法。

  1. 枚举法-素数就是一个只能被1和自己整除的正整数   

    只有1和它本身两个因数的自然数是素数,否则就叫合数。

def isPrime( N ):""" judge whether N is a prime numberparam:  N (int)retype: bool"""if N <= 1:return Falseelse:flag = True     # from 2 to N-1for  i in range(2, N):if (N % i) == 0:flag = Falsebreakreturn flag

         2. 开方判断素数法-N如果不能被小于等于它的平方根√N范围内的数整除,就是素数    
      假设N是一个合数,N = a*b,a为N的约数。a、b中肯定存在一个数>=根号N,另一个数<=根号N。    只要<=根号N的数不能整除N,那么N就不存在除1外的因数。则N为素数。
import math
def isPrimeSqrt( N ):if N <= 1:return Falseelse:flag = Truenum = int( math.sqrt(N) )for  i in range(2, num+1):if (N % i) == 0:flag = Falsebreakreturn flag

    3.埃氏素数筛法-从给定的数字序列中不断剔除2到N的倍数,直到不变 
           普通地做法就是累次地剔除能被2到N之间的数整除的数,剩下的就是素数。实际上,可以将除数范围调整到2到根号N,在根号N之前已经把所有能被整除的数剔除了。  
from math import sqrtdef seive( N ):if N < 2:return []else:L = [ i for i in range(2, N+1) ]     num = len(L)for i in range(2, int( sqrt(num) )+1 ):L = list( filter( lambda x: (x%i != 0) or x == i , L) ) return L


三 完整代码

     python版本

import math
def generatePrime( N ):prime = [ i for i in range(1,N+1) if isPrime(i) ]return primedef sievePrime( n ):""" Implement the seive og Eratosthenesparam:  n (int)retype: list(int)"""A = [ i for i in range(n+1)]num = int( math.sqrt(n) )for p in range(2, num+1):if A[p] != 0: # p hasn't been eliminated on previous passes            j = p * pwhile j <= n: # p*p <= nA[j] = 0 # mark element as eliminatedj = j + p # 剔除p的倍数L = [ item for item in A if item >= 2 ]return LN = int( input() )
cntPrimePair = 0
differ = 0
#for i in N:
#primes = generatePrime( N )
primes = sievePrime( N )
length = len(primes)
for i in range(length):if i < (length - 1):differ = primes[i+1] - primes[i]if differ == 2:cntPrimePair += 1
print(cntPrimePair)

  C语言版本

#include <stdio.h>int isPrime( int N )
{   /* 穷举法判断素数 */if ( N <= 1 ) {return 0;        } else {int flag = 1;for ( i = 2; i < N; i++ ) {if ( (N % i) == 0 ) {flag = 0;break;}}return flag;            }
} int isPrimeSqrt( int num )
{int flag = 1;int N = sqrt(num);int i;for ( i = 2; i <= N; i++ ){if (num % i == 0) {flag = 0;} }return flag;
}int generatePrime( int primes[], int N )
{int i, j;for ( j = 0, i = 1; i <= N; i++ ) {if ( isPrimeSqrt(i) ) {primes[j++] = i;}}return j; /* prime index */
}int main(int argc, char *argv[])
{int i, N, border;int differ, cntPrimePair;border = differ = cntPrimePair = 0;scanf("%d", &N);int primes[N];for ( i = 0; i < N; i++ ) {primes[i] = 0;}border = generatePrime( primes, N );for ( i = 0; i < (border-1); i++ ) {differ = primes[i+1] - primes[i];//printf("differ %d\n", differ);if ( differ == 2 ) {cntPrimePair += 1;            }}    printf("%d\n", cntPrimePair);return 0;
}

View Code

转载于:https://www.cnblogs.com/justLittleStar/p/10675816.html

PTA(BasicLevel)-1007素数对猜想相关推荐

  1. C++学习之路 | PTA乙级—— 1007 素数对猜想 (20分)(精简)

    1007 素数对猜想 (20分) 让我们定义d ​n ​​ 为:d ​n ​​ =p ​n+1 ​​ −p ​n ​​ ,其中p ​i ​​ 是第i个素数.显然有d ​1 ​​ =1,且对于n> ...

  2. PAT-B 1007.素数对猜想

    1007. 素数对猜想 让我们定义 $d_n$ 为:$d_n = p_{n+1} - p_n$,其中 pi 是第i个素数.显然有 d1=1 且对于n>1有 $d_n$ 是偶数."素数对 ...

  3. 【PAT】1007. 素数对猜想 (20)

    1007. 素数对猜想 (20) 让我们定义 dn 为:dn = pn+1 - pn,其中 pi 是第i个素数.显然有 d1=1 且对于n>1有 dn 是偶数."素数对猜想" ...

  4. 1007 素数对猜想 (20分)

    1007 素数对猜想 (20分) 让我们定义 ​​ 为:dn=pn+1−pnd_{n} = p_{n+1} - p_{n}dn​=pn+1​−pn​,其中pip_{i}pi​是第iii个素数.显然有d ...

  5. 1007 素数对猜想(C语言)

    1007 素数对猜想 (20 分) 让我们定义 dn 为:dn = pn+1 - pn,其中 pi 是第i个素数.显然有 d1=1 且对于n>1有 dn 是偶数 ,给定任意正整数N(<10 ...

  6. 1007 素数对猜想 (20 分)

    1007 素数对猜想 (20 分) 让我们定义dn为:dn=pn+1−pn,其中pi是第i个素数.显然有d1=1,且对于n>1有dn是偶数."素数对猜想"认为"存在 ...

  7. 1007 素数对猜想 (20分)(C语言)

    1007 素数对猜想 (20分) 让我们定义d ​n ​​ 为:d ​n ​​ =p ​n+1 ​​ −p ​n ​​ ,其中p ​i ​​ 是第i个素数.显然有d ​1 ​​ =1,且对于n> ...

  8. PAT (Basic Level) Practice (中文)1007 素数对猜想 (20 分)

    题目 让我们定义d​n 为:d​n​​ =p​n+1​​ −p​n​​ ,其中pi​​ 是第i个素数.显然有d​1​​ =1,且对于n>1有d​n​​ 是偶数."素数对猜想" ...

  9. 1007 素数对猜想 (20 分)(c语言)

    让我们定义dn​为:dn​=pn+1​−pn​,其中pi​是第i个素数.显然有d1​=1,且对于n>1有dn​是偶数."素数对猜想"认为"存在无穷多对相邻且差为2的 ...

最新文章

  1. Atitit java 二维码识别 图片识别
  2. java pom.xml 自定义变量
  3. 基站基带fgpa 服务器芯片,基于FPGA的AIS基带数据处理芯片设计
  4. 自动化运维工具——ansible安装及模块介绍
  5. TMDS——最小化传输差分信号及其协议
  6. NoSql数据库:Cassandra,Mongo,Redis数据库比较
  7. 1024 程序员节专题论坛来袭,聚焦企业级开源数据库 openGauss
  8. 去掉烦人的 “ ! = null (判空语句)
  9. iOS协议、代理、Block和回调、类别
  10. 如何扩展/删除swap分区
  11. MySQL——几种常见的嵌套查询
  12. ogg是什么格式的文件后缀
  13. CAN总线物理值与原始值
  14. 汇编语言期末不挂科必备复习知识点
  15. 项目经理如何做好授权管理?
  16. 技术篇(二)Demo示例——Bundle打包和加载
  17. 绩效考核成绩管理平台
  18. htmlunit 使用代理IP
  19. Elasticsearch rest-high-level-client 基本操作
  20. 解决bug-python中关于Process finished with exit code -1073740791

热门文章

  1. 编程有多可怕 | 每日趣闻
  2. 大厂面试通关图鉴:骚话走一走,百万薪到手!
  3. 为什么我十分喜欢 C,却很不喜欢 C++
  4. 程序员的浪漫,你值得拥有!
  5. 程序员如何打造个人品牌?
  6. 惨烈!程序员放弃了 Python!?发生了啥?
  7. PHP的cookie与session的使用
  8. 给妹子讲python-S01E18初探函数作用域
  9. Java的Json解析包FastJson使用
  10. C#实现rabbitmq 延迟队列功能