PAT乙级1007

1007 素数对猜想 (20分)

题目地址:https://pintia.cn/problem-sets/994805260223102976/problems/994805317546655744

难搞哦

输入格式:

输入在一行给出正整数N

输出格式:

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

输入样例

20

输出样例

4

我的理解

找到所有的从1到N之间的素数,素数相减差值为2时,素数对个数加1。

  1. 注意1, 2,都是素数的特殊性。
  2. 判断素数时,大于2的偶数都不是素数,可以跳过。
  3. 判断大于2的数n是不是素数时,只需判断能不能被3到根号n整除即可,数学的知识,目前我也不知道为什么。

代码段

#include
#include
using namespace std;
int main() {
    int number = 0;
    cin >> number;
    int prime[number];
    int index = 0;
    if (number < 3) {
        cout << 0 << endl;
    } else {
        // 外层遍历,从1到需要判断的数
        prime[index++] = 1;
        prime[index++] = 2;
        for (int i = 3; i <= number; i += 2) {
            // 如果是除了2 之外的偶数,都不是素数
            if (i > 2 && i % 2 == 0) {
                continue;
            }
            bool flag = true;
            // 需要判断i是否为素数的方式,如果有从 3到 (<=)i 的平方根之间的数j,
            // 可以被j整除,则i不是素数 ,
            int upperLimit = sqrt(i);
            for (int j = 3; j <= upperLimit; j++) {
                // 满足整除,不是素数
                if (i % j == 0) {
                    flag = false;
                    break;
                }
            }
            // 是素数,存储到prime数组中
            if (flag) {
                prime[index++] = i;
            }
        }
        // 统计相差为2 的素数对
        int primeCounter = 0;
        for (int i = 1; i < index; i++) {
            if (prime[i] - prime[i-1] == 2) {
                primeCounter++;
            }
        }
        cout << primeCounter << endl;
    }
    return 0;
}

你可能感兴趣的:(PAT乙级1007)