题目来源:http://acm.hdu.edu.cn/diy/contest_showproblem.php?pid=1009&cid=31286&problem=Problem%20%20I
解法或类型:循环结构。
Description
把一个偶数拆成两个不同素数的和,有几种拆法呢?
Input
输入包含一些正的偶数,其值不会超过10000,个数不会超过500,若遇0,则结束。
Output
对应每个偶数,输出其拆成不同素数的个数,每个结果占一行。
Sample Input
30
26
0
Sample Output
3
2
题意描述
给你一个偶数,让你通过计算得出这个偶数可以有几组两个不同的素数想加得到。
解题思路
先把小于这个偶数的所有素数求出,存在一个数组里面,然后通过双层循环让数组内的数依次两两相加,若结果等于输入的偶数,算作一种情况,双层循环类似数组的排序。
时空分析:
程序代码:
#include<stdio.h>
#include<math.h>
int prime(int m);
int main()
{
inta[10000],m,d,number;
inti,j,n,t;
while(scanf("%d",&number),number)
{
t=0;
for(i=2;i<number;i++)
{
if(prime(i)!=0)
{
a[t]=i;
t++;
}
}
n=0;
for(i=0;i<t;i++)
{
for(j=i+1;j<t;j++)
{
if(a[i]+a[j]==number)
n++;
}
}
printf("%d\n",n);
}
return0;
}
int prime(int m)
{
inti,k;
if(m==1)
return0;
k=(int)sqrt(m);
for(i=2;i<=k;i++)
{
if(m%i==0)
return0;
}
return1;
}
错误分析:
1、内层循环j的起始应该是i+1,写成了i,可能出现这个偶数可以由两个相同的素数组成的情况,造成结果比实际值大。