Problem Description
把一个偶数拆成两个不同素数的和,有几种拆法呢?
Input
输入包含一些正的偶数,其值不会超过10000,个数不会超过500,若遇0,则结束。
Output
对应每个偶数,输出其拆成不同素数的个数,每个结果占一行。
Sample Input
30 26 0
Sample Output
3 2#include<stdio.h> int main() { int n,i,j,s,a[10000]; for(i=3;i<=10000;i++) a[i]=i; for(i=2;i<=10000;i++) for(j=2*i;j<=10000;j+=i) a[j]=0; while(scanf("%d",&n)!=EOF&&n) { s=0; for(i=3;2*i<n;i++) if(a[i]+a[n-i]==n) ++s; printf("%d\n",s); } return 0; }
自然的做法:
#include <stdio.h> #include <math.h> int IsPrime(int n) { int i; for (i=2; i<=sqrt(n); i++) { if (n % i == 0) return 0; } return 1; } int main() { int n, i, cnt; while (scanf("%d", &n) && n) { cnt = 0; for (i=3; i<n/2; i+=2)//一定要从3开始,2是素数表中唯一的偶数。直接加2避免偶数进入判断 {//因为是不同的两个素数,那必定一个比n/2大,一个比n/2小 if (IsPrime(i) && IsPrime(n-i)) cnt++; } printf("%d\n", cnt); } return 0; }