题目来源:http://acm.hdu.edu.cn/showproblem.php?pid=2098
问题描述:
分拆素数和
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 38752 Accepted Submission(s): 16942
Problem Description
把一个偶数拆成两个不同素数的和,有几种拆法呢?
Input
输入包含一些正的偶数,其值不会超过10000,个数不会超过500,若遇0,则结束。
Output
对应每个偶数,输出其拆成不同素数的个数,每个结果占一行。
Sample Input
30 26 0
Sample Output
3 2
题目分析:对于任意偶数,拆成两个不同的素数,求有几种拆法。
解题思路:函数求解,写一个判断素数的函数,在主函数中调用两次,若i和n-i都成立,结果加一。
错误原因:循环应从可拆出的最小素数3开始,而不是可拆出两个不同素数的最小数5开始,且拆出的两个素数是两个不同素数。
代码实现:
#include<stdio.h>
#include<math.h>
int prime(int m);
int main (void)
{
int n,i,a;
while(scanf("%d",&n),n!=0)
{
a=0;
for(i=3;i<n/2;i++)
{
if(prime(i)!=0)//找出可拆出的两个素数中较小的数
{
if(prime(n-i)!=0)//若n-i的值也为素数,结果加一
a++;
}
}
printf("%d\n",a);
}
return 0;
}
int prime(int m)//判断素数
{
int i,k;
if(m==1)
return 0;
k=(int)sqrt(m);
for(i=2;i<=k;i++)
{
if(m%i==0)
return 0;
}
return 1;
}