分拆素数和
Problem Description
把一个偶数拆成两个不同素数的和,有几种拆法呢?
Input
输入包含一些正的偶数,其值不会超过10000,个数不会超过500,若遇0,则结束。
Output
对应每个偶数,输出其拆成不同素数的个数,每个结果占一行。
Sample Input
30 26 0
Sample Output
3 2
分析:
设输入的数为n 可以拆分为(1,n-1) (2,n-2)…(n/2-1,n/2+1)
遍历1到n/2-1 判断拆分后的两数是否为素数即可
方法1:
#include <iostream>
#include <cmath>
using namespace std;
bool shu(int x);
int main()
{
int n;
while(cin>>n,n!=0)
{
int d=0;
for(int i=2;i<=n/2;i++)
{
if(i!=(n-i))
if(shu(i)&&shu(n-i))
d++;
}
cout<<d<<endl;
}
return 0;
}
bool shu(int x) //对传统素数判断做了优化
{
if(x==2)
return 1;
if(x%2==0)return 0;
for(int i=3;i<=sqrt((double)x);i+=2)
if(x%i==0)return 0;
return 1;
}
#include <iostream>
#include <cmath>
using namespace std;
bool shu(int x);
int main()
{
int n;
while(cin>>n,n!=0)
{
int d=0;
for(int i=2;i<=n/2;i++)
{
if(i!=(n-i))
if(shu(i)&&shu(n-i))
d++;
}
cout<<d<<endl;
}
return 0;
}
bool shu(int x) //对传统素数判断做了优化
{
if(x==2)
return 1;
if(x%2==0)return 0;
for(int i=3;i<=sqrt((double)x);i+=2)
if(x%i==0)return 0;
return 1;
}
方法2
埃拉托斯特尼筛子法 (很好的方法,判断素数会经常用到) 模板#define m 100000 //范围 int a[m]; for(i=2;i<m;i++) a[i]=1; //数组值初始为1; a[0]=a[1]=0; //0 和1不是素数 去掉 for(i=2;i<sqrt(m);i++) //遍历2到 根号m if(a[i]) //如果i是素数 或者没判断过的 初始值为1的 for(j=i*i;j<m;j+=i) //i为素数 就从i^2开始到m 将i的倍数设为0 a[j]=0; 这样判断i是否为素数只需调用a【i】的值看是否为1