您的位置:首页 > 其它

1007. 素数对猜想 (20)

2016-12-04 11:32 295 查看
让我们定义 dn 为:dn = pn+1 - pn,其中 pi 是第i个素数。显然有 d1=1 且对于n>1有 dn 是偶数。“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。

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

输入格式:每个测试输入包含1个测试用例,给出正整数N。

输出格式:每个测试用例的输出占一行,不超过N的满足猜想的素数对的个数。

输入样例:

20

输出样例:

4

这道题用Python写测试点5运行超时,估计是由于数据过大引起,为证明这个猜想,采用C语言按照一样的算法运行一遍,可以通过,附上python和c的代码。

更新:不AC不舒服,换了一种判断素数的方法,成功AC。新算法的原理:就是当i是质数的时候,i的所有的倍数必然是合数。这个类似于找合数,然后剩下的就是素数。

python旧版

from math import *
n = input()
count = 0
i = 2
p1 = 2
while( i <= n): //一般找素数的算法
j = 2
while(j <= int(sqrt(i))):
if(i % j == 0):
break
j += 1
if(j > int(sqrt(i))):
d = i - p1
p1 = i
if(d == 2):
count += 1
i += 1
print count


python新版

from math import *
n = input()
isPrime = []
p1 = 2
count = 0
for i in range(1, n + 2, 2): //初始化,当下标为奇数时为1,偶数时为0,注意特殊的2
isPrime.append(0)
isPrime.append(1)
isPrime[2] = 1
//从这开始是找素数
for i in range(2, int(sqrt(n) + 0.999)): //对于刷题而言,还是感觉C的for循环好用。这里+0.999
if isPrime[i] == 1:                 //是防止n的根号是整数,这时候+1的话就浪费一次了
for j in range(2 * i, n + 1, i):
isPrime[j] = 0
for i in range(2, n + 1):
if isPrime[i] == 1:
if i - p1 == 2:
count += 1
p1 = i
print count


C

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main()
{
int n, count, i, p1, j, d;
scanf("%d", &n);
count = 0;
i = 2;
p1 = 2;
while(i <= n)
{
j = 2;
while(j <= sqrt(i))
{
if(i % j == 0)
break;
j++;
}
if(j > sqrt(i))
{
d = i - p1;
p1 = i;
if(d == 2)
count++;
}
i++;
}
printf("%d", count);

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  PAT乙级