HDU-2098 分拆素数和(素数打表)

把一个偶数拆成两个不同素数的和,有几种拆法呢?

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;
}

猜你喜欢

转载自blog.csdn.net/qq_40707370/article/details/82113417