poj2739解题报告

#include<iostream>
#include<math.h>
#include<string>
using namespace std ;
const int MAX=10000;  
bool flag[MAX+1];   
int a[MAX+1];   
int size=0;   
void prime(int max)  
{  
    memset(flag,true,sizeof(flag));  
    int t=sqrt((double)max)+1;
    int i,j,k;  
    for(i=2;i<=t;i++)  
    {  
        if(flag[i])  
            for(j=2,k=max/i+1;j<k;j++)  
                flag[i*j]=false; 
    }  
    for(i=2;i<=max;i++)  
    {  
        if(flag[i])  
        {  
            a[size++]=i;
        }  
    }  
}  
int main()
{
int i,j,n,sum,num,s;
prime(MAX);
for (;;)
{
   cin>>n;
   num=0; 
   for (i=0;i<MAX+1;i++)
{
   if (n>=a[i] && n<=a[i+1]) {s=i+1;}
}
if (n==0) return 0;
   else
{  
  
            for(i=0;i<s;i++)  
{  
                sum=0;  
                if(a[i]>n) break;  
                for(j=i;j<MAX+1;j++)  
{  
                    sum+=a[j];  
                    if(sum==n)   
{  
                        num++;
       break;  
}  
                    if (sum>n)  
                        break;  
}  
}
       cout<<num<<endl;
}
}
    return 0;

}

这题是我重做的,一开始那种打表枚举的方法实在是太渣,这是素数筛法的做法,素数筛法大概意思就是,一大串数字中,先把第一个素数的倍数所有的倍数都去掉,然后把接下来第一个素数的倍数全部删掉,如此以往,最后剩下的所有的数都是素数了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值