大视野入门OJ1099:歌德巴赫猜想

Posted mojibake

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了大视野入门OJ1099:歌德巴赫猜想相关的知识,希望对你有一定的参考价值。

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就是线性筛的部分。

以上是关于大视野入门OJ1099:歌德巴赫猜想的主要内容,如果未能解决你的问题,请参考以下文章

oj---pat----b1005---继续(3n+1)猜想

Light oj 1099 - Not the Best 次短路

[JSOI2007]字符加密

bzoj 1787 Meet 紧急集合

learnopengl“入门”的全部代码

二分图匹配入门专题1I - Hiding Gold light oj 1152二分图匹配-------------------我是终于不那么水的水题分割线------------------(代码片