您的位置:首页 > 其它

POJ 2739

2016-04-22 11:06 169 查看
首先求出10000以内的所有质数,然后对每个输入的2-10000的数,对每个小于这个数的每个质数开始往后加和,若和等于输入的数则计数加一。

就是用穷举的思想,没有超时,若超时,可以用列表的方法做:就是对于每个数提前求出它的值然后存入一个数组,然后对于输入的数直接输出提前存好的数就可以了。

#include<iostream>

using namespace std;

int main()

{

    int prime[6001]={0};

    //int subprime[1300]={0};

    unsigned int primelen=0;

    for(int i=2;i<10001;i++)

    {

        bool flag=true;

        for(int j=2;j<=i/2;j++)

        {

            if(i%j==0)

            {

                flag=false;

                break;

            }

        }

        if(flag==true)

        {

            prime[primelen]=i;

            primelen++;

        }

    }

  /*  for(int i=0;i<primelen;i++)

    {

        if(i%10==9)

        {

            cout<<prime[i]<<endl;

        }

        else

        {

            cout<<prime[i]<<' ';

        }

    }

    */

    int a;

    while(cin>>a&&a!=0)

    {

        int num=0;

        for(unsigned int i=0;i<primelen;i++)

        {

            int sum=0;

            int j=0;

            //int sublen=0;

            while(sum<a)

            {

                sum+=prime[i+j];

                //subprime[j]=prime[i+j];

                j++;

            }

            if(sum==a)

            {

                num++;

               /* for(int k=0;k<j;k++)

                {

                    cout<<subprime[k]<<' ';

                }

                cout<<endl;

                */

            }

            if(prime[i]>=a)

            {

                break;

            }

        }

        cout<<num<<endl;

    }

    return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: