把一个偶数拆成两个不同素数的和,有几种拆法呢?
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;
}
Java AC代码
import java.util.Arrays;
import java.util.Scanner;
public class Main {
private static boolean[] prime;
private static int maxn=(int)1e4+2;
public Main()
{
prime=new boolean[maxn];
}
public void getPrime(int n)
{
Arrays.fill(prime, true);
prime[0]=prime[1]=false;
for(int i=2;i*i<n;i++)
{
if(prime[i])
{
for(int j=i*i;j<n;j+=i)
prime[j]=false;
}
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner in=new Scanner(System.in);
int x;
Main test=new Main();
test.getPrime(maxn);
x=in.nextInt();
while(x!=0)
{
int k=0;
for(int i=2;i<=x/2;i++)
{
if(prime[i]&&prime[x-i]&&i!=x-i)
k++;
}
System.out.println(k);
x=in.nextInt();
}
}
}