把一个偶数拆成两个不同素数的和,有几种拆法呢? Input输入包含一些正的偶数,其值不会超过10000,个数不会超过500,若遇0,则结束。Output对应每个偶数,输出其拆成不同素数的个数,每个结果占一行。Sample Input
30 26 0Sample Output
3 2
主要就是先判断出素数,再用一个数组装每个素数的值,最后遍历求和,找到能够加起来等于N的一组后计数器CNT+1,最后输出即可,但是这个方法会超时,后面想到用筛法来判素数,可能代码出现一些问题同样报错,查了一下,一个偶数如果能拆分为小于这个偶数的两个素数和,那么这两个素数一定分布在这个偶数的一半的两边,所以只用判断素数就可以了,同时判断素数的地方上限只用判断到sqrt(n),因为如果2到sqrt(n)没有素数,sqrt(n)到n也没有素数
超时代码:
#include<iostream>
using namespace std;
int main()
{
int n;
while (scanf("%d", &n) != EOF)
{
if (n == 0)break;
int i, j, k = 0, sum = 0, cnt = 0;
int num[1000] = {0};
for (i = 0; i <= n; i++)
{
for (j = 2; j < i; j++)
{
if (i%j == 0)
{
break;
}
}
if (i== j)
{
num[k++] = i;
}
}
for (i = 0; i <= n; i++)
{
for (j = i+1; j <= n; j++)
{
sum = num[i] + num[j];
if (sum == n)
{
cnt++;
}
}
}
cout << cnt << endl;
}
return 0;
}
AC代码:
#include<iostream>
using namespace std;
int judge(int num);
int main(){ int n; while (scanf("%d", &n) != EOF&&n) { int i, sum = 0; for (i = 2; i < n / 2; i++) { if (judge(i) && judge(n - i)) { sum = sum + 1; } } cout << sum << endl; }}int judge(int num){ int i; for (i = 2; i*i <= num; i++) { if (num%i == 0) return 0; } return 1;
}