HDU 2098 分拆素数和

HDU 2098 分拆素数和

Time Limit: 1000/1000 MS (Java/Others)

Memory Limit: 32768/32768K (Java/Others)

【题目描述 - Problem Description】

  把一个偶数拆成两个不同素数的和,有几种拆法呢?

【输入 - Input】

【输出 - Output】

  输入包含一些正的偶数,其值不会超过10000,个数不会超过500,若遇0,则结束。

  对应每个偶数,输出其拆成不同素数的个数,每个结果占一行。

【输入样例 - Sample Input】

【输出样例 - Sample Output】

30

26

0

3

2

【题解】

  数据不大,能打表偷懒就打表偷懒吧,素数筛即可。

【代码 C++】

 1 #include <cstdio>
 2 #include <cstring>
 3 #define mx 10005
 4 int opt[mx];
 5 void rdy(){
 6     bool prim[mx];
 7     memset(prim, 0, sizeof(prim));
 8     prim[2] = 1;
 9     int i, j;
10     for (i = 3; i < mx; i += 2){
11         if (prim[i]) continue;
12         for (j = i << 1; j < mx; j += i) prim[j] = 1;
13     }
14     for (i = 3; i < mx; i += 2){
15         if (prim[i]) continue;
16         for (++opt[j = i + 2]; j < mx; j += 2){
17             if (!prim[j] && j + i < mx) ++opt[j + i];
18         }
19     }
20 }
21 int main(){
22     rdy();
23     int a;
24     while (scanf("%d", &a), a) printf("%d
", opt[a]);
25     return 0;
26 }
原文地址:https://www.cnblogs.com/Simon-X/p/5472291.html