| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 830 人关注过本帖
标题:偶尔看到一本比较古老的书,才发现 筛选法 往出筛素数 并不是多么新新的算 ...
只看楼主 加入收藏
ying8501
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:6
帖 子:1092
专家分:1446
注 册:2008-11-24
收藏
得分:10 
不是计算机专业,看不懂5楼的代码。只能稍微优化一下楼主的程序。
程序代码:
#include <stdio.h>
#include <math.h>
#define max 300
int main()
{    int i,k,j,t[max]={0,0,2}, M=sqrt(max);
      for(i=3; i<max;i+=2)t[i]=i;   //将3~max-1中奇数放入数组
    // 逐步去掉3的倍数,5的倍数…,(<= sqrt(max))等素数的倍数
    //  将k的倍数置为0   
    k=3;  //初始素数
     while(k<=M)
    {
           for(j=k+2;j<max;j+=2)  //从奇数k+2~max中去掉k的倍数
              if( j%k==0) t[j]=0;
       k=k+2;
       while(t[k]==0)k+=2; //找出下一个素数
    }
    j=0;
    for(i=2; i<max;i++)
    {
        if(t[i]!=0)
        {
            printf("%6d",i);j++;
            if(j%10==0) printf("\n");
         }
    }
    printf("\n\n    一共有%d个素数.\n",j); return 0;
}



[ 本帖最后由 ying8501 于 2014-4-2 20:36 编辑 ]
2014-04-02 19:50
tlliqi
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:204
帖 子:15453
专家分:65956
注 册:2006-4-27
收藏
得分:10 
表示没有看懂
2014-04-02 20:26
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:10 
呵呵从来没人说过筛法是新算法,还有我们现在求最大公约数用的辗转相除法,都是两千多年前就有了的。

万哥的代码本质上没错,不过一般不这么用。筛法本就是一种用空间换时间的算法,数的位置与数值已经存在对应关系,所以没必要在变量里保存这个数值,存个标记就可以了(运算也不需要取模这种在整数运算里最耗时间的指令)。

也正因如此可以用一个bit来表示,也就是你们前面讨论的位压缩。不过这种压缩很有限,包括你们讨论的也只能压缩到字节表示的1/16。对于求大规模的素数时好处不明显,相反增加了更多的寻址与位运算,效率反倒更低。

素数筛在我的代码中出现频率很高,涉及素数的地方一般都用筛法,因为简单有效,主要部分也就两三行代码。万哥有兴趣可以翻翻看。

重剑无锋,大巧不工
2014-04-02 22:07
icanbestrong
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:100
专家分:138
注 册:2013-3-13
收藏
得分:10 
我记得连续六个数只需要检查两个即可,因为其中有三个是2的倍数,一个3的倍数,所以只用查两个,可以用i=6-i实现,i初始值为2;此外,有的数比如既是5的倍数,有可能也是7的倍数,这样0就赋值了多次,可以查一下线性筛选,给楼主推荐一本书吧,冼镜光的C语言命题精选百则,也是一本很古老的书
2014-04-02 23:10
icanbestrong
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:100
专家分:138
注 册:2013-3-13
收藏
得分:0 
我记得连续六个数只需要检查两个即可,因为其中有三个是2的倍数,一个3的倍数,所以只用查两个,可以用i=6-i实现,i初始值为2;此外,有的数比如既是5的倍数,有可能也是7的倍数,这样0就赋值了多次,可以查一下线性筛选,给楼主推荐一本书吧,冼镜光的C语言命题精选百则,也是一本很古老的书
2014-04-02 23:10
快速回复:偶尔看到一本比较古老的书,才发现 筛选法 往出筛素数 并不是多么新 ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.027167 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved