题意:给你一个数,认为它能拆成两个素数之和的形式,有几组素数则输出几
例:10= 3+7
思路:打印素数表,判断x-prime[a]是否为素数即可
代码:
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 using namespace std; 5 6 #define MAXN 1000001 7 #define ll 8 int cnt,counts; 9 long long num; 10 bool isprime[MAXN]; 11 long long prime[MAXN]; 12 bool vis[MAXN]; 13 14 bool datecin() 15 { 16 counts=0; 17 memset(vis,1,sizeof(vis)); 18 if(scanf("%lld",&num)!=EOF) 19 { 20 if(num==0) 21 return false; 22 return true; 23 } 24 return false; 25 } 26 27 void getprime() 28 { 29 int i,j; 30 memset(isprime,1,sizeof(isprime)); 31 isprime[0]=isprime[1]=cnt=0; 32 for(i=2;i*i<MAXN;i++) 33 { 34 if(isprime[i]) 35 { 36 for(j=i*i;j<MAXN;j+=i) 37 { 38 if(isprime[j]) 39 { 40 isprime[j]=false; 41 } 42 } 43 44 } 45 } 46 for(i=2;i<MAXN;i++) 47 { 48 if(isprime[i]) 49 prime[cnt++]=i; 50 } 51 } 52 53 void showisp() 54 { 55 for(int i=0;i<MAXN;i++) 56 { 57 if(isprime[i]) 58 cout<<i<<' '; 59 } 60 cout<<endl; 61 for(int i=0;i<cnt;i++) 62 { 63 cout<<prime[i]<<' '; 64 } 65 } 66 67 int datecal() 68 { 69 for(int i=0;i<cnt;i++) 70 { 71 if(num<prime[i]) 72 break; 73 if(isprime[num-prime[i]]&&vis[prime[i]]) 74 { 75 counts++; 76 vis[prime[i]]=0; 77 vis[num-prime[i]]=0; 78 } 79 } 80 return counts; 81 } 82 int main() 83 { 84 getprime(); 85 //showisp(); 86 #ifdef ll 87 while(datecin()) 88 { 89 cout<<datecal()<<endl; 90 } 91 #endif // ll 92 return 0; 93 }