码迷,mamicode.com
首页 > 其他好文 > 详细

【素数】 poj 2739 一个数能有多少种连续素数相加方案

时间:2014-10-10 11:43:44      阅读:195      评论:0      收藏:0      [点我收藏+]

标签:style   blog   color   io   os   for   数据   sp   div   

简单题 素数打表   根据数据量  用n2算法遍历  开一个save【k】素数存前k个素数和即可。

 

#include <iostream>
#include <cstdio>
#include <memory.h>
#include <cmath>
using namespace std;
const int maxn=10002;
int pri[maxn+1];
int save[2000+1];
int s[2000+1];
void make_pri()
{
    pri[0]=0;
    pri[1]=0;
    for(int i=2;i<=maxn;i++)
    {
        pri[i]=1;
    }
    for(int i=2;i*i<=maxn;i++)
    {
        if(pri[i])
        {
            for(int j=i*i;j<=maxn;j+=i)
            pri[j]=0;
        }
    }
}
void init()
{
    memset(save,0,sizeof(save));
    memset(s,0,sizeof(s));
    int i,j=2;
    s[1]=2;
    for(i=3;i<=maxn;i++)
    {
        if(pri[i]==1)
        {
            s[j++]=i;
        }
    }
    for(int i=1;i<=2000;i++)
    {
        save[i]=save[i-1]+s[i];
    }
 }
int main()
{
    //freopen("in.txt","r",stdin);
    memset(save,0,sizeof(save));
    make_pri();
    init();
    int n;
    while(cin >> n && n!=0)
    {
        int cnt=0;
        int last;
        if(pri[n]==1)
        {
            for(int i=2000;i>=1;i--)
            {
                if(s[i]==n)
                {
                    last=i;
                }
            }
        }
        else
        {
            for(int i=2000;i>=1;i--)
            {
                if(s[i]<n && s[i+1]>n)
                {
                    last=i;
                }
            }
        }
        for(int i=last;i>=1;i--)
        {
            for(int j=i-1;j>=0;j--)
            {
                if(save[i]-save[j]==n)
                {
                    cnt++;
                }
            }
        }
        cout << cnt << endl;
    }
    return 0;
}

 

【素数】 poj 2739 一个数能有多少种连续素数相加方案

标签:style   blog   color   io   os   for   数据   sp   div   

原文地址:http://www.cnblogs.com/balfish/p/4015169.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!