HDU 2098 分拆素数和(素数)
http://acm.hdu.edu.cn/showproblem.php?pid=2098
题意:
给你一个偶数,问你这个偶数有多少种方式能由两个不同的素数构成?
分析:
首先求出10000以内的所有素数。
如果这个偶数X能有两个不同的素数构成,那么一定一个小于(X/2-1). 只要从小到大枚举这个比较小的素数a,然后看看X-b是否是素数即可得到一种组合方式。
依次统计所有组合方式即可。
AC代码:
#include<cstdio> #include<algorithm> #include<cstring> using namespace std; const int maxn=10000; //flag[i]==1表i是素数 bool flag[maxn+5]; int prime[maxn+5]; //筛选法求maxn内所有素数 int get_prime() { for(int i=2;i<=maxn;i++) { if(!prime[i]) { prime[++prime[0]]=i; flag[i]=true; } for(int j=1;j<=prime[0] && prime[j]<=maxn/i; j++) { prime[prime[j]*i]=1; if(i%prime[j]==0) break; } } return prime[0]; } int main() { get_prime(); int x; while(scanf("%d",&x)==1 && x) { int ans=0;//方法数 for(int i=1;i<=prime[0] && prime[i]<= x/2-1;i++) { if(flag[x-prime[i]]) ans++; } printf("%d\n",ans); } return 0; }
原文地址:http://blog.csdn.net/u013480600/article/details/41172271