题目大意:给一个偶数,判断是否是两个素数的和。
先用sieve方法生成一个素数表,然后再进行判断即可。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <cstdio> 2 #include <vector> 3 #include <bitset> 4 using namespace std; 5 typedef vector<int> vi; 6 typedef long long ll; 7 #define MAXN 1000000 8 9 vi primes; 10 bitset<MAXN+100> bs; 11 12 void sieve(ll upper) 13 { 14 bs.set(); 15 bs.set(0, false); 16 bs.set(1, false); 17 for (ll i = 2; i <= upper; i++) 18 if (bs.test((size_t)i)) 19 { 20 for (ll j = i*i; j <= upper; j += i) 21 bs.set((size_t)j, false); 22 primes.push_back((int)i); 23 } 24 } 25 26 int main() 27 { 28 #ifdef LOCAL 29 freopen("in", "r", stdin); 30 #endif 31 sieve(MAXN); 32 int n; 33 while (scanf("%d", &n) && n) 34 { 35 int idx = 1; 36 bool ok = false; 37 while (primes[idx] * 2 <= n) 38 { 39 int t = n - primes[idx]; 40 if (bs.test((size_t)t)) 41 { 42 ok = true; 43 break; 44 } 45 idx++; 46 } 47 if (ok) printf("%d = %d + %d ", n, primes[idx], n-primes[idx]); 48 else printf("Goldbach's conjecture is wrong. "); 49 } 50 return 0; 51 }