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的素数”. 现给定任意正 ...
随机推荐
- SQL Server Management Studio 2012 键盘快捷键(转)
无论是对于DBA还是Developer,键盘快捷键都是很常用的,动动键盘可比鼠标快多了,不过SQL Server 2012对SSMS(SQL Server Management Studio)中的快捷 ...
- 使用CALayer制作View的辉光效果
使用CALayer制作View的辉光效果 实现以下的辉光效果: 思路是这样子的: 1. 创建好需要实现辉光效果的View 2. 对这个View进行截图 3. 将这个截图重新添加进View中 4. 对这 ...
- 安装SCOM Reporting Server
在SQL群集计算机上可以安装SCOM Reporting Server. 1.运行SQL Server安装程序,选择 全新安装SQL Server,不能向已有的群集实例中添加Reporting Ser ...
- Linux下php-fpm进程过多导致内存耗尽问题
这篇文章主要介绍了解决Linux下php-fpm进程过多导致内存耗尽问题,需要的朋友可以参考下 最近,发现个人博客的Linux服务器,数据库服务经常挂掉,导致需要重启,才能正常访问,极其恶心,于是 ...
- Samba文件共享服务器配置
Samba起源: 早期网络想要在不同主机之间共享文件大多要用FTP协议来传输,但FTP协议仅能做到传输文件却不能直接修改对方主机的资料数据,这样确实不太方便,于是便出现了NFS开源文件共享程序:NFS ...
- January 04 2017 Week 1st Wednesday
Nothing happens unless first a dream. 一切始于梦想. I have a dream, one day I can be the expert in this fi ...
- 如果要遍历除了for循环,你还知道什么?——JavaScript的各种遍历方式
如果要遍历除了for循环,你还知道什么?——JavaScript的各种遍历方式 这是曾经面试中的一道题目,当时的我用现在很潮的话讲,整个人是懵比的,我呆呆的说了句,我好像只知道for循环啊.后来回过神 ...
- 020.1.2 Arrays集合工具类
内容:一些关于集合常用方法 在Java.util包里面,可以自己测试一下1.查找2.复制数组3.复制数组指定范围4.排序5.返回hash值6.数组转换成String7.数组转换成集合 Arrays.a ...
- MySQL监控内容
一.liunx操作系统层面1.整体cpu负载的%user最好不长期超过20%(若%user太高,有极大可能性是索引使用不当)2.整体cpu负载的%iowat最好不长期超过10%(确认I/O子系统是否有 ...
- select poll epoll Linux高并发网络编程模型
0 发展历程 同步阻塞迭代模型-->多进程并发模型-->多线程并发模型-->select-->poll-->epoll-->... 1 同步阻塞迭代模型 bind( ...