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