曾经沧海难为水,除却巫山不是云。|

Joey-Wang

园龄:4年3个月粉丝:17关注:0

5.4 素数

5.4 素数

http://codeup.hustoj.com/contest.php?cid=100000591

C Goldbach's Conjecture

image-20200717171033608

题目释义

哥德巴赫猜想:对于任何大于或等于4的偶数n,至少存在一对素数p1和p2,使得n = p1 + p2。

现需编写程序,对输入的偶数n,输出满足猜想条件的所有素数对的数量。

每个输入行中都有一个整数。您可以假定每个整数都是偶数,并且大于或等于4且小于2 ^ 15。输入的结尾由数字0表示。

第一行输入m表示样例数目,接下来m行为各个具体样例;

第二行输入n表示此样例中数字个数,接下来n个为具体数字。需求这n个数的最小公倍数。

题目解析

1⃣️ 第一步肯定打表(素数表),因为输入数n范围[4, 32768),所以为保险,用埃氏筛法进行打表。【O(nloglogn)】

  • 因为输入数最大为1<<15,故素数表最大容量定为1<<15

2⃣️ 首先想到的是通过暴力方法,采用双重循环遍历所有素数,将两个素数相加,看是不是等于n,是则ans++。【O(n2)】

方法二:💡 n = p1 + p2,则应一个数>=n/2,一个数<=n/2,故只需一重循环遍历所有<=n/2的素数p1,若n-p1也为素数,则ans++。【O(n)】

(而因为埃氏筛法bool数组p,刚好可通过O(1)复杂度判断 n-p1 是否为素数😁)

代码1(暴力)

#include <cstdio>

const int MAX = 1 << 15;

int prime[MAX], pNum = 0;
bool p[MAX] = {false};

void find_prime() {
    for (int i = 2; i < MAX; i++) {
        if (!p[i]) {
            prime[pNum++] = i;
            for (int j = i + i; j < MAX; j += i) {
                p[j] = true;
            }
        }
    }
}

int main() {
    find_prime();
    int n;
    while (scanf("%d", &n) != EOF && n) {
        int ans = 0;
        for (int i = 0; i < pNum; i++) {
            for (int j = i; j < pNum; j++) {
                if (prime[i] + prime[j] == n) ans++;
                if (prime[j] >= n) break;
            }
            if (prime[i] >= n) break;
        }
        printf("%d\n", ans);
    }
    return 0;
}

代码2(思考后简化复杂度💡)

#include <cstdio>

const int MAX = 1 << 15;

int prime[MAX], pNum = 0;
bool p[MAX] = {false};

void find_prime() {
    for (int i = 2; i < MAX; i++) {
        if (!p[i]) {
            prime[pNum++] = i;
            for (int j = i + i; j < MAX; j += i) {
                p[j] = true;
            }
        }
    }
}
int main() {
    find_prime();
    int n;
    while (scanf("%d", &n) != EOF && n) {
        int ans = 0;
        for (int i = 0; i < pNum && prime[i] <= n / 2; i++) {
            if (!p[n - prime[i]]) ans++;
        }
        printf("%d\n", ans);
    }
}

本文作者:Joey-Wang

本文链接:https://www.cnblogs.com/joey-wang/p/14541170.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   Joey-Wang  阅读(89)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
展开