把一个偶数拆成两个不同素数的和,有几种拆法呢?
Input
输入包含一些正的偶数,其值不会超过10000,个数不会超过500,若遇0,则结束。
Output
对应每个偶数,输出其拆成不同素数的个数,每个结果占一行。
Sample Input
30 26 0
Sample Output
3 2
解题思路:这道题可以使用素数打表的方法,素数打表使用的是埃拉托斯特尼筛法
关于埃斯托尼筛法可以参考博客:埃拉托斯特尼筛法
AC代码:
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=1e4+10;
int a[maxn];
void isprime(int n)//埃拉托斯特尼筛法
{
fill(a,a+n,1);//将所有的数都认为是素数初始化为 1,
for(int i=2;i*i<=n;i++)
{
if(a[i])//如果i是素数,显然 i 的倍数都不是素数,
{
for(int j=i*i;j<=n;j+=i)
a[j]=0;//不是素数标记为0
}
}
}
int main()
{
int x;
isprime(maxn);
while(cin>>x,x)
{
int k=0;
for(int i=2;i<=x/2;i++)
{
if(a[i]&&a[x-i]&&i!=x-i)
k++;
}
cout<<k<<endl;
}
return 0;
}