程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> POJ 2739 Sum of Consecutive Prime Numbers(素數)

POJ 2739 Sum of Consecutive Prime Numbers(素數)

編輯:C++入門知識

POJ 2739 Sum of Consecutive Prime Numbers(素數)


POJ 2739 Sum of Consecutive Prime Numbers(素數)

 

題意:

給你一個10000以內的自然數X,然後問你這個數x有多少種方式能由連續的素數相加得來?

分析:

首先用素數篩選法把10000以內的素數都找出來按從小到大保存到prime數組中。

然後找到數X在prime中的上界, 如果存在連續的素數之和==X, 那麼一定是從一個比X小的素數開始求和(不會超過X的上界),直到和sum的值>=X為止。

所以我們暴力枚舉10000以內的所有可能的素數相加和的起始點i,然後求連續素數的和,看看當前以prime[i]開始的連續素數和是否正好==X。

由於10000以內的素數很少(只有1000多個),所以本題找連續素數和可以暴力枚舉解決。

AC代碼:

 

#include
#include
#include
using namespace std;
const int maxn=10000;

//篩選法求素數
int prime[maxn+5];
int get_prime()
{
    memset(prime,0,sizeof(prime));
    for(int i=2;i<=maxn;i++)
    {
        if(!prime[i]) prime[++prime[0]]=i;
        for(int j=1; j<=prime[0] &&prime[j]<=maxn/i; j++)
        {
            prime[prime[j]*i]=1;
            if(i%prime[j]==0) break;
        }
    }
    return prime[0];
}

int main()
{
    //預處理:求10000以內所有素數
    get_prime();

    int x;
    while(scanf(%d,&x)==1 && x)
    {
        if(x<2)
        {
            printf(0
);
            continue;
        }
        int bound=lower_bound(prime+1,prime+prime[0]+1,x)-prime;
        int ans=0;
        if(prime[bound]==x) ans++;
        for(int i=1;i

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved