#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;
}
用欧拉筛法优化斯特尼筛法(质数筛法)
最新推荐文章于 2023-11-18 10:30:48 发布