zoukankan      html  css  js  c++  java
  • Sum of Consecutive Primes

    解题关键在于用筛选法求得素数(详细可百度)

    所谓“筛选法”指的是“埃拉托色尼(Eratosthenes)筛法”。他是古希腊的著名数学家。他采取的方法是,在一张纸上写上1到100全部整数,然后逐个判断它们是否是素数,找出一个非素数,就把它挖掉,最后剩下的就是素数。

    具体做法如下:
    <1> 先将1挖掉(因为1不是素数)。
    <2> 用2去除它后面的各个数,把能被2整除的数挖掉,即把2的倍数挖掉。
    <3> 用3去除它后面的各数,把3的倍数挖掉。
    <4> 分别用4、5…各数作为除数去除这些数以后的各数。这个过程一直进行到在除数后面的数已全被挖掉为止。例如找1~50的素数,要一直进行到除数为47为止(事实上,可以简化,如果需要找1~n范围内素数表,只需进行到除数为n^2(根号n),取其整数即可。例如对1~50,只需进行到将50^2作为除数即可。)

    然后从第一个素数开始枚举累加(放心,这道题这样不会超时)

    看完“狼代码”博客后才知道这样的思路,代码有参考它的写法。

     1 #include<iostream>
     2 #include<memory.h>
     3 using namespace std;
     4 const int MAXN = 10005;
     5 bool isPrime[MAXN];
     6 int prime[MAXN],pnum;
     7 
     8 void getPrime()
     9 {
    10     // 筛选法求素数 
    11     memset(isPrime,true,sizeof(isPrime));
    12     for(int i = 2; i <= MAXN; i ++)
    13         if(isPrime[i])
    14             for(int j = i; j*i <= MAXN; j ++)
    15                 isPrime[i*j] = false;
    16     
    17     // 获取素数数组 
    18     pnum = 1;
    19     for(int i = 2; i <= MAXN; i ++)
    20         if(isPrime[i])
    21             prime[pnum ++] = i;
    22 }
    23 
    24 
    25 int main()
    26 {
    27 getPrime();
    28 int n;
    29 while(cin>>n&&n!=0)
    30 {
    31 int all=0;
    32 for(int i=1;prime[i]<=n;i++)
    33 {
    34 int sum=0;
    35 int x=i;
    36 while(sum<=n)
    37 {
    38 sum+=prime[x++];
    39 if(sum==n) all++;
    40 }
    41  
    42 }
    43 cout<<all<<endl;
    44 } 
    45 //system("pause");
    46 } 
  • 相关阅读:
    Linux 之 文件压缩解压
    Linux 之 文件搜索命令
    Linux 之 文件内容查看
    Linux 之 Vim常用命令
    Linux 之 CentOS练习
    CentOS找不到想要的镜像版本?
    Swoole 简单学习(2)
    Swoole 简单学习
    svn的简单知识
    8、16、32-BIT系列单片机区别与特点
  • 原文地址:https://www.cnblogs.com/cfhome/p/2693104.html
Copyright © 2011-2022 走看看