分拆素数和
题目描述
把一个偶数拆成两个不同素数的和,有几种拆法呢?
Iutput
输入包含一些正的偶数,其值不会超过10000,个数不会超过500,若遇0,则结束。
Output
对应每个偶数,输出其拆成不同素数的个数,每个结果占一行。
Sample Input
30
26
0
Sample Output
3
2
思路:
先把1~10000范围内所有的素数建表,判断输入的这个数减去表中的素数的差是否也在表中;
代码
#include <cstdio>
#include <cstring>
using namespace std;
bool is_prime(int x)
{
int i;
for(i=2;i*i<=x;i++){
if(x%i==0)
return false;
}
return true;
}
int main()
{
int i,j=0;
int x,temp,cnt;
int prime1[10005],prime2[10005];
for(i=0;i<10005;i++)
prime1[i]=0;
for(i=2;i<10005;i++){
if(is_prime(i)){
prime1[i]=1;//标记
prime2[j++]=i;//记录
}
}
//for(i=0;i<100;i++)
//printf("%d ",prime2[i]);
while(scanf("%d",&x),x){
cnt=0;
for(i=0;prime2[i]<x/2;i++)
{
temp=x-prime2[i];
if(prime1[temp])
cnt++;
}
printf("%d\n",cnt);
}
return 0;
}