用欧拉筛法优化斯特尼筛法(质数筛法)

#include <iostream>
#include <cstdio>
#include <vector>
#include <cstring>

using namespace std;
const int g_kMaxs = 1000000;
bool g_u[g_kMaxs+1];
vector<int> g_primer;

void Init() {
    g_primer.clear();
/*
下面是素数的欧拉筛法:
该法优化的原理是保证
每个合数仅被它最小的
质因数筛去。
*/
    memset(g_u, true, sizeof(g_u));
    for (int i = 2; i <= g_kMaxs; i++) {
        if (g_u[i]) {
            g_primer.push_back(i);
        }
        for (int j = 0; j < (int)g_primer.size(); j++) {
            if (g_primer[j]*i > g_kMaxs) break;
            g_u[g_primer[j]*i] = false;
            if (i % g_primer[j] == 0) break; // 若当前素数为i的最小素因子,则分析下一个素数
/*
证明当 i % gprime[j] == 0 时,任意的 k > j 有g_preime[k]*i 有比gprime[k]小的质因子
证明:令 x = i / g_prime[j] => x 为整数
g_prime[k]*i = g_prime[k]*k*g_prime[j] => g_preime[k]*i 有比gprime[k]小的质因子g_prime[j];

证明当 i % g_prime[j] != 0时, g_prime[j]*i 没有比g_prime[j]小的质因子
证明: 假设 g_prime[j] * i 有比g_prime[j] 小的质数必然是 i 有比g_prime[j]小的质因子
而变量j由0递增意味着质数的递增,通过每次的 if (i % g_primer[j] == 0) break;判断
保证了i不可能有比 g_prime[j]小的质数。否则循环在走到当前 j 之前结束。
从而假设不成立,原命题成立。
*/
        }
    }
}

int main()
{
    int n = 0;
    Init();
    freopen("in.txt", "r", stdin);
    while (EOF != scanf("%d", &n) && n) {
        for (int i = 2; i <= n/2+1; i++) {
            if (g_u[i] && g_u[n-i]) {
                printf("%d = %d + %d\n", n, i, n-i);
                break;
            }
        }
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值