HDU-分拆素数和-2098

来源:互联网 发布:windows pipe select 编辑:程序博客网 时间:2024/06/18 16:22

点击打开链接



分拆素数和

Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 40107    Accepted Submission(s): 17570


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

Input
输入包含一些正的偶数,其值不会超过10000,个数不会超过500,若遇0,则结束。
 

Output
对应每个偶数,输出其拆成不同素数的个数,每个结果占一行。
 

Sample Input
30260
 

Sample Output
32
题解:当数很大时,为避免反复判断是不是素数,可以用打表法;另外,如果直接遍历所有两个素数和会超时,要想到要想两个素数和为n,肯定一个大于n,一个小于n,这是只要保证两个都是素数就行了


#include<stdio.h>  #include<algorithm>  #include<iostream>  using namespace std;  int a[10000],p[10000];//全局变量会默认a[1000]={0};  void dabiao()//打表,找出10000内所有的素数  {      int t=0,i,j;          a[1]=1;          for(i=2;i<10000;i++)              for(j=i+i;j<10000;j+=i)                  a[j]=1;              for(i=2;i<10000;i++)          if(!a[i])              p[t++]=i;  }  int main()  {      int n,i,j,sum[10000];      while(cin >> n&&n)      {          dabiao();          int ans=0;          for(i=3;i<n/2;i++)//N是偶数,且两个素数不相等,那么n不小于4,所以i可以从3开始;              if(!a[i]&&!a[n-i])                  ans++;      printf("%d\n",ans);       }      return 0;  }  




原创粉丝点击