把一个偶数拆成两个不同素数的和,有几种拆法呢?
详细问题见——分拆素数和
条件:输入一个正的偶数,数值不超过10000;个数不超过500;取0则结束
涉及到素数的筛法
#include<iostream>
#include<cmath> //数学函数库
/*
把一个偶数拆成两个不同素数的和,有几种拆法呢?
*/
/*abs()求绝对值 acos()求反余弦 asin()求反正弦 atan()求反正切 atan2()求反正切,按符号判定象限
ceil()求不小于某值的最小整数 (求上界) cos()求余弦 cosh()求双曲余弦 div()求商和余数等都是
cmath中可直接调用的函数
*/
using namespace std;
#define maxN 10000
int a[maxN];//全局数组 a[]数组容量最大可以为10000
void pre_computer()//素数的筛法
{
memset(a,1,sizeof(a));//将memset初始化为全为1的数组
/*函数拷贝
数组a 到buffer 从头开始的count 个字符里, 并返回buffer指针。
memset() 可以应用在将一段内存初始化为某个值。*/
a[0]=a[1]=0;
for(int i=2;i<maxN;++i)
{
for(int j=2;j<=sqrt(i);++j)
{
if(i%j==0)
{
a[i]=0;
break;
}
}
}
}
int main()
{
pre_computer();
int n,count;
while(cin>>n,n) //n取值肯定小于10000 输入一个正的偶数,数值不超过10000;个数不超过500;取0则结束
{
count = 0;
for(int i=2;i<n/2;++i)
{
if(a[i]&&a[n-i])
count++;
}
cout<<count<<endl;
}
return 0;
}