F - 分拆素数和

来源:互联网 发布:怎么申请不了淘宝主播 编辑:程序博客网 时间:2024/06/07 04:02

F - 分拆素数和

Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u
Submit

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

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

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

Sample Input
30
26
0

Sample Output
3
2


  1. 题意:将一个偶数分成两个素数之和,问有多少中分法。
  2. 思路:如果每输入一个偶数都要判断比此偶数小的数是不是素数,偶数与其之差是不是素数;分析可知,这种方法较为繁琐且浪费时间。对于这种处理数据较多且数据都在一定范围之内的题目,则可以选择打表的方法,把相同的数据处理部分放在外面,用几个数组或其他数据结构保存,大大节省了时间。
  3. 失误:刚开始没有想到用开一个素数表,再根据此素数表打一个次数表。
  4. 代码如下:

#include<iostream>#include<cstring>#include<algorithm>#include<cmath>#include<cstdio>using namespace std;int a[11111]={1,1},b[11111]={0};int main(){    __int64 m,i,n,t,j;    for(i=2;i<=10010;++i)    {        if(a[i]==1)        {            continue;        }        for(j=2*i;j<=10010;j+=i)        {            a[j]=1;        }    }    for(i=2;i<=10010;i+=2)    {        for(j=2;j<=i/2;++j)        {            if(a[j]==0&&a[i-j]==0&&j!=i-j)            {                ++b[i];            }        }    }    while(cin>>n,n)    {        cout<<b[n]<<endl;    }    return 0;}
0 0