1007 素数对猜想(20 分)(C/C++版本)

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

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

输入格式:

输入在一行给出正整数N

输出格式:

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

输入样例:

20

输出样例:

4

这道题思路很简单:
1.找出小于N的素数。
2.筛选符合条件的数。
#include <bits/stdc++.h>

using namespace std;

int main()
{
    unsigned int N, k = 1, count = 0;
    size_t n = 2;
    int *ptr;

    cin >> N;

    ptr = new int[N];
    //创建动态数组储存素数
    ptr[1] = 3;
    ptr[0] = 2;

    for (size_t m = 5; m <= N; ++m) {
        for (size_t i = 2; i <= sqrt(m); ++i) {
        //对于判断是否为素数,只需要判断小于这个数的平方根的数就行,可以自己想一想
            if (m % i == 0) {
                k = 0;//不是素数则令k = 0,在下面条件中剔除此数
                break;
            }
            k = 1;
        }
        if (k) {
            ptr[n] = m;
            ++n;
        }
    }
    
    for (size_t j = 0; j < n - 1; ++j)
        if (ptr[j + 1] - 2 == ptr[j])//前数与后数相差2
            ++count;

    cout << count;

    return 0;
}

 

C版本原理和C++一样

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

int main()
{
    unsigned int N, k = 1, count = 0, n = 2, m, i, j;
    int *ptr;

    scanf("%u", &N);

    ptr = (int*)malloc(sizeof(int) * N);
    ptr[1] = 3;
    ptr[0] = 2;

    for (m = 5; m <= N; ++m) {
        for (i = 2; i <= sqrt(m); ++i) {
            if (m % i == 0) {
                k = 0;
                break;
            }
            k = 1;
        }
        if (k) {
            ptr[n] = m;
            ++n;
        }
    }
    for (j = 0; j < n - 1; ++j){
        if (2 == ptr[j + 1] - ptr[j]){
            ++count;
        }
    }
    
    printf("%d", count);

    return 0;
}
posted @ 2018-09-10 01:07  Hk_Mayfly  阅读(965)  评论(0)    收藏  举报