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++】

 #include <cstdio>
#include <cstring>
#define mx 10005
int opt[mx];
void rdy(){
bool prim[mx];
memset(prim, , sizeof(prim));
prim[] = ;
int i, j;
for (i = ; i < mx; i += ){
if (prim[i]) continue;
for (j = i << ; j < mx; j += i) prim[j] = ;
}
for (i = ; i < mx; i += ){
if (prim[i]) continue;
for (++opt[j = i + ]; j < mx; j += ){
if (!prim[j] && j + i < mx) ++opt[j + i];
}
}
}
int main(){
rdy();
int a;
while (scanf("%d", &a), a) printf("%d\n", opt[a]);
return ;
}
上一篇:Ztree树节点应用


下一篇:合(析)取范式转主合(析)取范式--》Java实现