HDU 2098 分拆素数和

来源:互联网 发布:王者荣耀战绩数据分析 编辑:程序博客网 时间:2024/06/03 17:49
Problem Description
把一个偶数拆成两个不同素数的和,有几种拆法呢?
 
Input
输入包含一些正的偶数,其值不会超过10000,个数不会超过500,若遇0,则结束。
 
Output
对应每个偶数,输出其拆成不同素数的个数,每个结果占一行。
 
Sample Input
30260
 
Sample Output
32
#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;}



0 0