分拆素数和(在线操作)

题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=2098

hdu:2098:分拆素数和

Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 27221    Accepted Submission(s): 11915


Problem Description
把一个偶数拆成两个不同素数的和,有几种拆法呢?
 
Input
输入包含一些正的偶数,其值不会超过10000,个数不会超过500,若遇0,则结束。
 
Output
对应每个偶数,输出其拆成不同素数的个数,每个结果占一行。
 
Sample Input
30 26 0
 
Sample Output
3 2
 
Source
 
题解:刚开始犯了一个致命的错误,没有看清这个题特意给出的数据范围,因为打表一定会超时的??所以在线操作就可以了,用筛法求素数
 1 #include<cstdio>
 2 #include<cstring>
 3 /*int IsPrime(int n)
 4 {
 5     int i;
 6     for (i=2; i<=sqrt(n); i++)
 7     {
 8         if (n % i == 0)
 9             return 0;
10     }
11     return 1;
12 }
13 */
14 #define N 10010
15 bool b[N];
16 void pri()
17 {
18     memset(b,0,sizeof(b));
19     for(int i = 2 ;i < N ;i++)
20     {
21         if(b[i]==0){
22             for(int j = i*i ; j < N ;j+=i)
23                 b[j] = 1;
24         }
25     }
26 }
27 int main()
28 {
29     int n, i, cnt;
30     pri();
31     while (scanf("%d", &n) && n)
32     {
33         cnt = 0;
34         for (i=3; i<n/2; i+=2)
35         {//因为是不同的两个素数,那必定一个比n/2大,一个比n/2小
36             if ( b[i]==0 && b[n-i]==0 )
37                 cnt++;
38         }
39         printf("%d
", cnt);
40     }
41     return 0;
42 }
原文地址:https://www.cnblogs.com/shanyr/p/4905460.html