UVa 543 - Goldbach's Conjecture

本文介绍了使用筛法生成素数表,并通过该表判断给定偶数是否能表示为两个素数之和的算法过程。通过循环遍历素数表,检查是否存在符合条件的素数对。

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

  先用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", n, primes[idx], n-primes[idx]);
48         else  printf("Goldbach's conjecture is wrong.\n");
49     }
50     return 0;
51 }
View Code

 

转载于:https://www.cnblogs.com/xiaobaibuhei/p/3329702.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值