从150ms优化到0ms的过程

P1579 哥德巴赫猜想(升级版)

HuskyRye @ 2017-08-29 16:16:18

150ms的思路: 打质数表,三层 for 循环遍历质数表,如果相等,就输出。

浪费在于:花了很多时间生成质数表,vector::push_back,vector::operator[] 等等

0ms的思路:

最后贴一下代码:遍历前两个数,用减法算出第三个数,且第三个数大于第二个数,如果三者都为质数,就输出

这样的好处在于:不需要频繁访问vector元素

#include <iostream>
#include <cmath>

using namespace std;

bool prime(int n)
{
    int temp = sqrt(n);
    for (int i = 2; i <= temp; ++i) {
        if (n % i == 0)
            return false;
    }
    return true;
}

int main()
{
    int n;
    cin >> n;
    int k;
    for (int i = 2; i < n; ++i)
        for (int j = 2; (k = n-i-j) >= j; ++j) {
                if (prime(i) && prime(j) && prime(k)) {
                    cout << i << ' ' << j << ' ' << k << '\n';
                    return 0;
                }
            }
}

by 暮光 @ 2017-09-04 16:04:00

可以继续优化 线性筛法得到素数表 两重循环遍历素数表 如果 第二个素数达到 n-第一个素数 的一半,第二重循环break。。


|