UVa 543

  题目大意:给一个偶数,判断是否是两个素数的和。

  先用sieve方法生成一个素数表,然后再进行判断即可。

 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 }
View Code
原文地址:https://www.cnblogs.com/xiaobaibuhei/p/3329702.html