【大视野入门OJ】1099:歌德巴赫猜想

Description

歌德巴赫猜想大家都很熟悉吧?
给一个数,能够分解成两个素数的和.
现在要给你一个n,6 <= n < 1000000,让你求他会分解成哪两个素数?
如果存在多组解,则要求第一个素数为最小的那组。

Input

测试包括多组数据,每行一个数。
整个测试以数字零代表结束。

Output

将小于等于n的偶数拆分为2个质数之和

Sample Input

8
20
42
0

Sample Output

8 = 3 + 5
20 = 3 + 17
42 = 5 + 37

 

题目本身不算难,不过还是很有意义。

首先此题高性能,不知道E筛效率怎么样所以我写了线性筛,可以说是好好地复习了一下素数的相关内容。

其次,还是代码能力的锻炼。这是很有帮助的。现在写大的code,常常感觉东漏一点西漏一点,这都是基础不牢靠,代码能力不强的结果。所以写写这些题目,一来帮助复习数论,二来锻炼代码能力。

 1 #include <cstdio>
 2 using namespace std;
 3 
 4 int  num = 1;
 5 int  prime[1000100],tot;
 6 bool not_prime[1000100];
 7 
 8 void createPrimeTable(int n){
 9     for(int i = 2; i <= n; i++){
10         if(!not_prime[i]) prime[tot++] = i;
11         for(int j = 0; j != tot && i * prime[j] <= n; j++){
12             not_prime[i * prime[j]] = 1;
13             if(i % prime[j] == 0)break;
14         }
15     }
16 }
17 
18 int main(int argc, char const *argv[]){
19     createPrimeTable(1000100);
20     while(num){
21         scanf("%d",&num);
22         if(!num)return 0;
23         for(int i=1;i<=1000100;i++){
24             if(not_prime[num-prime[i]]==false){
25                 printf("%d = %d + %d\n",num, prime[i], num - prime[i] );
26                 break;
27             }
28         }
29     }
30     return 0;
31 }

createPrimeTable就是线性筛的部分。

转载于:https://www.cnblogs.com/mojibake/p/8542514.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值