poj 2739 Sum of Consecutive Prime Numbers

来源:互联网 发布:python 语音实时采集 编辑:程序博客网 时间:2024/06/05 03:35

题目大意:给出一个正数,把它分解为n个连续素数的和,求解有几种分解方法。

分析:我用的是最简单粗暴的方法,先用筛法得到素数表,再用双重循环判断是否连续的几个素数的和是否等于给定的数,如果大于则调到第一层循环,找下一个素数列。

下面上代码:(代码注释的一处是我第一次做的时候没有考虑完善的地方,所以没能得到正确结果)

#include<stdio.h>#include<stdlib.h>#include<string.h>#define TRUE 1#define FALSE 0#define N 10010int p[N];    //若i为素数,则p[i[==1void prime(void){    //利用筛法得出素数表    int i,j;    memset(p,1,sizeof(p));  //先假设所有数都是素数    p[0]=p[1]=0;    for(i=2;i*i<N;i++)    {        if(p[i])            for(j=2*i;j<N;j+=i) p[j]=0;    }}int solve(int sum){    int cnt;//cnt用于计数    int i,j;    int sumtemp=0;    for(j=2,cnt=0;j<=sum;j++,sumtemp=0)    {        if(p[j])    sumtemp+=j;        else    continue;       //此处这样做是因为j可能不是素数,        //故如果不单独处理,而放在第二层循环中一块从处理则会出现重复的情况,        //如17=17=2+3+5+7中17可能在j=14是被算到一次,即cnt++一次,        //故最后结果错误        if(sumtemp==sum)    cnt++;        for(i=j+1;i<sum;i++)        {            if(p[i])    sumtemp+=i;            if(sumtemp>sum) break;            if(sumtemp==sum)            {                cnt++;                break;            }        }    }    return cnt;}int main(){    int sum;    prime();    while(scanf("%d",&sum)==1&&sum)    {        printf("%d\n",solve(sum));    }    return 0;}


0 0