1007素数对猜想

问题描述:
让我们定义d​n 为:dn =pn+1−pn,其中pi 是第i个素数。显然有d1=1,且对于n>1有dn是偶数。“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。

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

输入格式:
输入在一行给出正整数N。

输出格式:
在一行中输出不超过N的满足猜想的素数对的个数。

输入样例:
20
输出样例:
4

思路1:
1.求出给定正整数的所有素数并存进数组中
2.对满足dn = pn+1 - pn 的dn计数

这题本来很简单的,但是时间限制是两秒钟,根据上面的思路让我想了好多种方法,但还是超时错误。
如下所示:

//求解素数
    for (int i = 2 ; i <= number ; i++ )
    {
        int j = 2;
        while (j < i && i % j != 0) //没有公共质因子
        {
            j++;
        }
        if (i == j)                 
        {
            vec.push_back(i);
            if (vec.size() > 1)
            {
                if ((vec[1] - vec.front()) == 2)
                {
                    count++;
                }
                vec[0] = vec[1];
                vec.pop_back();
            }
            
        }
    }

思路二:从5到给定正整数的范围区间[5,正整数],判断第i个正整数和第i+2个正整数是否为素数,并且差为2。但还是有一个测试time limited.

#include 

int main()
{
    int number;
    std::cin >> number;
    int count = 0;
    int prim = 3;
    for (int i = 5; i <= number; i += 2)
    {
        int j;
        for ( j = 2; j < i; j++)
        {
            if (i % j == 0)
            {
                break;
            }
        }
        if (j == i)
        {
            if ((i - prim) == 2)
            {
                count++;
            }
            prim = i;
        }
    }
    std::cout << count << std::endl;

    return 0;
}

然后呢想到下面那个:使用bool数组记录已经验证过的不是素数的正整数。

#include 

int main()
{
    const int maxN = 100000;
    bool p[maxN] = { 0 };
    //n为待验证的正整数,primer为上一个素数,k为素数对计数
    int n, primer = 0, k = 0;

    scanf("%d", &n);
    for (int i = 2; i <= n; ++i)
    {
        //还没验证是否为素数的正整数才验证
        if (!p[i])
        {
            for (int j = i + i; j < n; j += i)
            {  
                p[j] = true;    //已经确定不是素数的正整数
            }
            if (primer != 0 && i - primer == 2)
            {
                ++k;
            }
            primer = i;
        }
    }

    printf("%d\n", k);
    
    return 0;
}

你可能感兴趣的:(1007素数对猜想)