本题链接:点击打开链接
分拆素数和
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 38816 Accepted Submission(s): 16977
Problem Description
把一个偶数拆成两个不同素数的和,有几种拆法呢?
Input
输入包含一些正的偶数,其值不会超过10000,个数不会超过500,若遇0,则结束。
Output
对应每个偶数,输出其拆成不同素数的个数,每个结果占一行。
Sample Input
30 26 0
Sample Output
3 2
Source
Recommend
解题思路:
这题不难,闲来无事敲着玩玩,只是可能费时比较高,我以前做的用了300多ms,当时还做了好久才搞懂,现在再用打表的方法做了一下就0ms了。
以前的代码:
#include <stdio.h>
#include<math.h>
int sushu(int t)
{
int j;
for(j=2;j<=sqrt(t);j++)
if(t%j==0)
return 0;
return 1;
}
int main()
{
int t,a,b,k,i;
while(~scanf("%d",&t)&&t)
{
k=0;
for(i=3;i<t-i;i+=2)
{
a=sushu (t-i);
b=sushu (i);
if(a&&b)
k++;
}
printf("%d\n",k);
}
return 0;
}
现在的代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn=10000+10;
bool a[maxn];
void sushu()
{
memset(a,true,sizeof(a));
for(int i=2; i<maxn; i++)
{
if(a[i])
for(int j=i+i; j<maxn; j+=i)
{
a[j]=false;
}
}
}
int main()
{
int n;
sushu();
while(~scanf("%d",&n)&&n)
{
int c=0;
for(int i=2; i<n-i; i++)
{
if(a[i]&&a[n-i])
c++;
}
printf("%d\n",c);
}
return 0;
}
反正大家看看就好,水题就不啰嗦了,代码相信大家都懂。