PTA(BasicLevel)-1007素数对猜想
一 问题描述-素数对
让我们定义素数差dn为:dn=pn+1−pn,其中pi是第i个素数。显然有d1=1,且对于n>1有dn是偶数。“素数对猜想”认为“存在无穷多对相邻且差为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素数对猜想的更多相关文章
- PAT乙级 1007. 素数对猜想 (20)
1007. 素数对猜想 (20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 让我们定义 dn 为:dn = ...
- PAT-乙级-1007. 素数对猜想 (20)
1007. 素数对猜想 (20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 让我们定义 dn 为:dn = ...
- [C++]PAT乙级1007.素数对猜想 (20/20)
/* 1007. 素数对猜想 (20) 让我们定义 dn 为:dn = pn+1 - pn,其中 pi 是第i个素数.显然有 d1=1 且对于n>1有 dn 是偶数.“素数对猜想”认为“存在无穷 ...
- PAT 1007 素数对猜想(20)
1007 素数对猜想(20 分) 让我们定义dn为:dn=pn+1−pn,其中pi是第i个素数.显然有d1=1,且对于n>1有dn是偶数."素 ...
- 【PAT】1007. 素数对猜想 (20)
1007. 素数对猜想 (20) 让我们定义 dn 为:dn = pn+1 - pn,其中 pi 是第i个素数.显然有 d1=1 且对于n>1有 dn 是偶数.“素数对猜想”认为“存在无穷多对相 ...
- PAT 乙级 1007.素数对猜想 C++/Java
1007 素数对猜想 (20 分) 题目来源 让我们定义dn为:dn=pn+1−pn,其中pi是第i个素数.显然有d1=1,且对于n>1有dn是偶数.“ ...
- PAT 乙级 1007. 素数对猜想 (20) c++ 筛选法求素数
PAT 乙级 1007. 素数对猜想 (20) c++ 筛选法求素数 让我们定义 dn 为:dn = pn+1 - pn,其中 pi 是第i个素数.显然有 d1=1 且对于n>1有 dn 是偶数 ...
- PAT (Basic Level) Practice (中文)1007 素数对猜想 (20分)
1007 素数对猜想 (20分) 让我们定义dn为:dn = pn+1 − pn,其中pi是第i个素数.显然有d1 = 1,且对于n > 1有dn是偶数."素数对猜想"认 ...
- PAT——1007. 素数对猜想
让我们定义 dn 为:dn = pn+1 - pn,其中 pi 是第i个素数.显然有 d1=1 且对于n>1有 dn 是偶数.“素数对猜想”认为“存在无穷多对相邻且差为2的素数”. 现给定任意正 ...
随机推荐
- 进程间通信——队列和管道(multiprocess.Queue、multiprocess.Pipe)
进程: 之前我们已经了解了操作系统中进程的概念,程序并不能单独运行,只有将程序装载到内存中,系统为它分配资源才能运行,而这种执行的程序就称之为进程.程序和进程的区别就在于:程序是指令的集合,它是进程运 ...
- Java 封装(内部类)
1.封装 封装是指,一种将抽象性函式接口的实例细节部份包装.隐藏起来的方法.封装可以被认为是一个保护屏障,防止该类的代码和数据被外部类定义的代码随机访问.要访问该类的代码和数据,必须通过严格的接口控制 ...
- 自学PHP有哪些书籍和教程值得推荐?
知乎上看到一题主询问:"自学PHP有哪些书籍和教程值得推荐?",互联网深度屌丝秦风给出了不错的答案,希望能够帮助自学PHP的朋友们. 以下仅供参考: 尤其不认可W3school之类 ...
- Scala编程实例:使用List和Tuple
本文节选自Martin Odersky,Lex Spoon和Bill Venners所著,Regular翻译的<Programming in Scala>的第三章.Scala是一种针对 J ...
- centos 7.0 查看selinux状态|关闭|开启
Linux在安装好之后通常SELinux都是出于默认开启的状态,开启的情况下会导致一些服务的安装不成功. 在不需要的情况下完全可以关闭掉,下面是在centos 7.0里面如何查看,关闭selinux. ...
- tomcat多实例.md
多tomcat实例 环境说明 操作系统:CentOS 6.6 JDK: # ll /usr/local/java lrwxrwxrwx 1 root root 22 Feb 27 17:43 /usr ...
- hook与链表操作
hook与链表的节点操作有相似之处: 链表的前后顺序相当于程序的执行流: 对链表节点的替换或插入相当于hook技术: 1.替换:用新的节点替换原来的节点: 2.前插入: 3.后插入: 修改原来的结构.
- leetcode shell
leetcode 195. 第十行 # | | 第一种是先取出前10行,然后取出最后一行.(但是不足10行,也可以取出最后一行) 正解: tail -n +K :从第K行取出所有 然后取出第一行 le ...
- 【[SDOI2014]数数】
被慎老师教育数位\(dp\)怎么写了 看来我数位\(dp\)的写法太落后了 这道题很显然就是一个\(AC\)自动机上的数位\(dp\),按照套路 我们可以设计\(dp[i][j][0/1]\)表示匹配 ...
- freemarker模板加载TemplateLoader常见方式
使用过freemarker的肯定其见过如下情况: java.io.FileNotFoundException: Template xxx.ftl not found. 模板找不到.可能你会认为我明明指 ...