1007. 素数对猜想 (20)

让我们定义 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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值