一 问题描述-素数对

  让我们定义素数差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 number
param: N (int)
retype: bool
"""
if N <= 1:
return False
else:
flag = True
     # from 2 to N-1
for i in range(2, N):
if (N % i) == 0:
flag = False
break
return 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 False
else:
flag = True
num = int( math.sqrt(N) )
for i in range(2, num+1):
if (N % i) == 0:
flag = False
break
return flag
  
3.
埃氏素数筛法-从给定的数字序列中不断剔除2到N的倍数,直到不变 
           普通地做法就是累次地剔除能被2到N之间的数整除的数,剩下的就是素数。实际上,可以将除数范围调整到2到根号N,在根号N之前已经把所有能被整除的数剔除了。  
from math import sqrt
def 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 prime def sievePrime( n ):
""" Implement the seive og Eratosthenes
param: 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 * p
while j <= n: # p*p <= n
A[j] = 0 # mark element as eliminated
j = j + p # 剔除p的倍数
L = [ item for item in A if item >= 2 ]
return L N = 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 <= ) {
return ;
} else {
int flag = ;
for ( i = ; i < N; i++ ) {
if ( (N % i) == ) {
flag = ;
break;
}
}
return flag;
}
} int isPrimeSqrt( int num )
{
int flag = ;
int N = sqrt(num);
int i;
for ( i = ; i <= N; i++ ){
if (num % i == ) {
flag = ;
}
}
return flag;
} int generatePrime( int primes[], int N )
{
int i, j;
for ( j = , i = ; 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 = ;
scanf("%d", &N); int primes[N];
for ( i = ; i < N; i++ ) {
primes[i] = ;
}
border = generatePrime( primes, N ); for ( i = ; i < (border-); i++ ) {
differ = primes[i+] - primes[i];
//printf("differ %d\n", differ);
if ( differ == ) {
cntPrimePair += ;
}
}
printf("%d\n", cntPrimePair); return ;
}

PTA(BasicLevel)-1007素数对猜想的更多相关文章

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

    1007. 素数对猜想 (20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 让我们定义 dn 为:dn = ...

  2. PAT-乙级-1007. 素数对猜想 (20)

    1007. 素数对猜想 (20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 让我们定义 dn 为:dn = ...

  3. [C++]PAT乙级1007.素数对猜想 (20/20)

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

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

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

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

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

  6. PAT 乙级 1007.素数对猜想 C++/Java

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

  7. PAT 乙级 1007. 素数对猜想 (20) c++ 筛选法求素数

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

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

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

  9. PAT——1007. 素数对猜想

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

随机推荐

  1. 采用powershell创建project网站集(摘抄自https://www.cnblogs.com/jindahao/p/5855668.html)

    采用powershell创建project网站集,具体步骤如下 1.输入License Enable-ProjectServerLicense –Key "23CB6-N4X8Q-WWD7M ...

  2. Java实例---简单的超市管理系统

    代码分析 Customer.java package test; public class Customer { private String name; private int customerTy ...

  3. OSG3.0.1的编译

    在OSG-中国有很多关于OSG的资料,包括OSG的编译和教程. 要编译OSG首先需要准备的包: 1,OSG3.0.1源代码: 2,CMAKE: 3,OSG用到的第三方库: 4,OSG Data:OSG ...

  4. How to Remove A Service Entry From Win10 Service List

    Warning Please do this operation CAREFULLY, otherwise you may get something wrong with your system. ...

  5. java继承-final关键词用法

    final关键字特点: 1.可以用来修饰变量.方法.类. 2.修饰的变量是一个常量.一旦被赋值就不能被修改(常量一般都和static关键字配合使用) 3.修饰类代表此类不能被继承4.修饰方法代表次方法 ...

  6. Eclipse中的BuildPath详解【转载】

    什么是Build Path? Build Path是指定Java工程所包含的资源属性集合. 在一个成熟的Java工程中,不仅仅有自己编写的源代码,还需要引用系统运行库(JRE).第三方的功能扩展库.工 ...

  7. JS实现图片上传之前先预览

    <html xmlns="http://www.w3.org/1999/xhtml"> <head id="Head1" runat=&quo ...

  8. JavaScript浏览器对象模型(BOM)之window对象

    一.BOM概述 BOM(Browser Object Model)浏览器对象模型,它提供了很多对象,用于访问浏览器的功能. BOM 缺少规范,每个浏览器提供商又按照自己想法去扩展它,那么浏览器共有对象 ...

  9. c++ 派生类的构造函数次序

    #include <iostream> using namespace std; class CFatherSum //父类Sum { public: CFatherSum(int iRe ...

  10. Xpath提取一个标签里的所有文本

    content = etree.HTML(text) h = content.xpath('//h1') h1 = h[0].xpath('string(.)').strip()