Description
歌德巴赫猜想大家都很熟悉吧?
给一个数,能够分解成两个素数的和.
现在要给你一个n,6 <= n < 1000000,让你求他会分解成哪两个素数?
如果存在多组解,则要求第一个素数为最小的那组。
给一个数,能够分解成两个素数的和.
现在要给你一个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就是线性筛的部分。