给出一个数字,然后用两个素数的和来表示这个数n;
先筛选素数,打表,然后遍历,从3开始,每次加2,因为偶数一定不是素数;
然后用n减去i,去判定是不是素数,不需要枚举;
#include<iostream>
#include<cstring>
#include<cmath>
#define MAXN 1000005
using namespace std;
bool isprime[MAXN];
void checkprime(int n) {//快速打表
memset(isprime, true, sizeof(isprime));
isprime[1] = false;//把1筛除
for(int i = 3; i <= n; i+=2) {
if(isprime[i]) {
for(int j=i+i; j <= n; j+=i) {//筛除以i为倍数的数字(一定不是素数)
isprime[j] = false;
}
}
}
}
int main () {
int n;
checkprime(MAXN);
while(cin >> n && n) {
int m = n, flag = 1;
for(int i = 3; i <= m; i+=2) {//遍历,注意i+=2
if(isprime[i] && isprime[n-i]) {
printf("%d = %d + %d\n", n, i, n-i);
flag = 0;
break;
}
}
if(flag) puts("Goldbach's conjecture is wrong.");
}
return 0;
}