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的素数”. 现给定任意正 ...
随机推荐
- vs安装部署“必备”组件里面正常情况没有出现office2010 PIA组件
vs安装部署“必备”组件里面正常情况没有出现office2010 pia组件时,将 Office2010PIARedist 文件夹放在C:\Program Files\Microsoft SDKs\W ...
- Django路由系统---Django重点之url别名
django重点之url别名[参数名必须是name,格式是name="XXX] 不论后台路径如何进行修改路径,前台访问的路径不变,永远是alias, 这样方便开发 前台根据 {{ url & ...
- strncpy()函数【转】
C/C++中的strncpy()函数功能为将第source串的前n个字符拷贝到destination串,原型为: char * strncpy ( char * destination, const ...
- 【[CQOI2015]选数】
这道题自然是可以反演的 按照反演的套路我们先设出两个函数 \(F(n)\)表示从\([L,H]\)中任选\(N\)个数的最大公约数是\(n\)或者\(n\)的倍数的情况数 \(f(n)\)表示从\([ ...
- 自定义ViewPagerIndicator-视图指示器
ViewPagerIndicator.java public class ViewPagerIndicator extends LinearLayout { private Paint mPaint; ...
- [转]谈谈关于MVP模式中V-P交互问题
在差不多两年的时间内,我们项目组几十来号人都扑在一个项目上面.这是一个基于微软SCSF(Smart Client Software Factory)的项目,客户端是墨尔本一家事业单位.前两周,我奉命负 ...
- sql连接查询INNER JOIN,LEFT JOIN,RIGHT JOIN区别
测试表 课程表cource 教师表teacher 查询老师教的课程 1.inner join内链接 ,只显示完全匹配的查询结果 SELECT cource.cname,teacher.tname f ...
- sqoop导数据到hive报错
[root@hadoop1 conf]# sqoop import --connect jdbc:mysql://192.168.122.15:3306/company --username sqoo ...
- Unity Loding白屏
卡loading很多时候是由于网络原因造成的,你可以尝试断网,进入离线模式.如果使用VPN也可以先关闭使用,部分Vpn的配置也会导致该问题出现.最后可以查看一下防火墙的设置.
- 获取url中?后面传递的参数
function getUrlArgs(){ var url=location.href; var i=url.indexOf('?'); if(i==-1)return; var querystr= ...