这一题是要计算10000之内的任意一个数最多有几个连续的素数组成. 难点就是在于确定10000之内的所有的素数,剩下的问题就好办了。

找出素数有两种方法:

第一种:这是最简单最容易先想到的方法

//get all prime number, methord 1
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
    int num = 0;
    for(int i=1; i<100; i++)
    {
        bool bFlag = true;
        for(int j=2; j<sqrt(i+1.0); j++)
        {
            if(i%j == 0){
                bFlag = false;
                break;
            }
        }
        if(bFlag)
            num++;
    }
    cout<<"have "<<num<<" prime numbers"<<endl;
    return 0;
}

第二种:参考自:http://blog.csdn.net/guiyinzhou/article/details/6437990

由于一个合数总是可以分解成若干个质数的乘积,那么如果把质数(最初只知道2是质数)的倍数都去掉,那么剩下的就是质数了。
例如要查找100以内的质数,首先2是质数,把2的倍数去掉;此时3没有被去掉,可认为是质数,所以把3的倍数去掉;再到5,再到7,7之后呢,因为8,9,10刚才都被去掉了,而100以内的任意合数肯定都有一个因子小于10(100的开方),所以,去掉,2,3,5,7的倍数后剩下的都是质数了。
用程序可以这样解决,引入布尔类型数组a[i],如果i是质数,a[i]=true,否则a[i]=false。那么划掉i可以表示成a[i]=false。

// get all prime number, methord 2
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
    int num = 0;
    int i,j;
    bool flagArray[10000];
    int primeArray[100];
    for(i = 0; i < 10000; i++)  
        flagArray[i] = true;
    for(i=2; i<sqrt(10000); i++)
    {    
        if(flagArray[i])
        {
            for(int j = i; j*i <= n; j++)
            {
                flagArray[j*i] = false;
            }
        }
    }
    j = 0;
    for(i=2;i<10000;i++)
    {
        if(flagArray[i])
        {
            primeArray[j]=i;
cout<<i<<" ";
++j; } } return 0; }

如果去掉最后一个用来显示结果的循环的话,运行第二种(10000000)只要1秒多,而第一种(10000000)却要71秒多。

最后整个程序如下:

#include <iostream>
#include <cmath>
using namespace std;
int main()
{
    int num = 0;
    int i,j;
    bool flagArray[10000];
    int primeArray[3000];
    for(i = 0; i < 10000; i++)  
        flagArray[i] = true;
    for(i=2; i<sqrt(10000.0); i++)
    {    
        if(flagArray[i])
        {
            for(int j = i; j*i < 10000; j++)
            {
                flagArray[j*i] = false;
            }
        }
    }
    j = 0;
    for(i=2;i<10000;i++)
    {
        if(flagArray[i])
        {
            primeArray[j]=i;
            //cout<<i<<" ";
            ++j;
        }
    }

    int T,sum,m,n,Answer;
    while(true)
    {
        cin>>T;
        if(T==0)
            break;
        Answer=0;
        for(m=0;m<=j;m++)
        {
            sum=0;
            for(n=m;n<=j;n++)
            {
                sum+=primeArray[n];
                if(sum == T)
                {
                    Answer++;
                    break;
                }
                else if(sum>T)
                {
                    break;
                }
            }
        }
        cout<<Answer<<endl;
    }
    return 0;
}
View Code

 

posted on 2015-05-06 10:40  暴走路人甲  阅读(734)  评论(1编辑  收藏  举报