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 } 
  • 相关阅读:
    使用数据库时注意单引号、双引号和反引号的区别
    Mysql中的事件
    C#使用WindowsMediaPlayer实现视频播放
    Chart控件,鼠标选择区域,可以局部放大缩小
    C#自定义控件在添加引用后不显示在工具箱的解决方法(转)
    C# 中的#if、#elif、#else、#endif等条件编译符号
    若有派生类,则基类中的析构函数要用虚函数
    迭代器失效
    this指针
    VS调试快捷键
  • 原文地址:https://www.cnblogs.com/cfhome/p/2693104.html
Copyright © 2011-2022 走看看