| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1516 人关注过本帖, 1 人收藏
标题:尝试列出 2,000,000以下的所有素数
只看楼主 加入收藏
ansic
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:恍惚窈冥
等 级:城市猎人
帖 子:1543
专家分:5367
注 册:2011-2-15
收藏
得分:0 
以下是引用voidx在2011-4-10 23:18:55的发言:

其实用 sieve 完全可以的。如果注释掉 printf(), msys 测得时间也只有 100ms 左右

#include <stdio.h>

#define LMT 2000000

int main() {
    char m[LMT] = {0};
    int i, j;
    printf ("2\t");
    for (i = 3; i < LMT; i+= 2) {
        if (!m) {
            printf("%d\t", i);
            for (j = i * 3; j < LMT; j += i * 2) {
                m[j] = 1;
            }
        }
    }
    return 0;
}

⊙﹏⊙b汗~~~ 这就是算法的力量呀!!

善人者,不善人之师;不善人者,善人之资。不贵其师,不爱其资,虽智大迷。
2011-04-10 23:38
张敏樱木花道
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:139
专家分:137
注 册:2011-3-26
收藏
得分:0 
没有半小时,是得不出结果的,我原先以为会很快的,可是我等了20多分钟都不见结果……
2011-04-10 23:56
卧龙孔明
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:59
帖 子:3872
专家分:684
注 册:2006-10-13
收藏
得分:10 
程序代码:
#include<stdio.h>
#define M (2000000+1)
char v[M];
int r[150000];
int p = 0;
int main(void)
{
    int i, j, t;
    for(i=2; i<M; i++)
    {
        if(!v[i])
        {
            r[p++] = i;
            printf("%d ", i);
        }
        for(j=0; j<p; j++)
        {
            if((t=i*r[j]) >= M) break;
            v[t] = 1;
            if(i%r[j] == 0) break;
        }
    }
    puts("");
    return 0;
}


更大数据规模下,此算法比10楼要快许多。复杂度是O(n),大概算1亿的质数不到10秒(不包括输出时间)。

[ 本帖最后由 卧龙孔明 于 2011-4-11 00:14 编辑 ]

My Blog: www.aiexp.info
虽然我的路是从这里开始的,但是这里不再是乐土.感谢曾经影响过,引导过,帮助过我的董凯,飞燕,leeco,starwing,Rockcarry,soft_wind等等等等.别了,BCCN.
2011-04-10 23:57
voidx
Rank: 12Rank: 12Rank: 12
来 自:邯郸
等 级:火箭侠
帖 子:1250
专家分:3538
注 册:2011-4-7
收藏
得分:0 
回复 12楼 张敏樱木花道
难道是我和孔明的 Sieve ? 绝对滴不可能
2011-04-11 00:08
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:0 
这种程序的复杂度感觉不太好估算,不过孔明的会快倒是很明显。
2011-04-11 08:54
张敏樱木花道
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:139
专家分:137
注 册:2011-3-26
收藏
得分:5 
#include<stdio.h>
#include<dos.h>
#include<math.h>
main()
{
    long i,j,k=0;
    int h,m,s;
    struct time t[1];
    gettime(t);
    h=t[0].ti_hour;/*显示开始执行的时间*/
    m=t[0].ti_min;
    s=t[0].ti_sec;
    printf("%d:%d:%d\n",h,m,s);
    for(i=3;i<2000000;i++)
    {
        for(j=2;j<sqrt(i);j++)
        {
            if(i%j==0) break;
        }
        if(j>=i) k++;
    }
    gettime(t);
    h=t[0].ti_hour;
    m=t[0].ti_min;
    s=t[0].ti_sec;
    printf("\n%d:%d:%d\n",h,m,s);/*显示执行完成后的时间*/
    sound(5000);
    delay(100);
    printf("%d",k);
    getch();
}/*改进算法之后,运行时间为2分3秒*/
以前不注意算法的时间复杂度,随意设计。现在通过这题,发现一个好的算法,一个高效的算法能成倍的提高程序的运行速度。
2011-04-11 12:04
voidx
Rank: 12Rank: 12Rank: 12
来 自:邯郸
等 级:火箭侠
帖 子:1250
专家分:3538
注 册:2011-4-7
收藏
得分:0 
孔明,我有个问题,把数组定义为全局最大长度可以多大? 定义为一个函数的本地变量最大长度可以多大?

[ 本帖最后由 voidx 于 2011-4-11 12:43 编辑 ]
2011-04-11 12:22
张敏樱木花道
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:139
专家分:137
注 册:2011-3-26
收藏
得分:0 
回复 17楼 voidx
如果你对他的算法质疑的话,我建议你上机试一下……
2011-04-11 12:56
河马拔河
Rank: 2
等 级:论坛游民
帖 子:31
专家分:15
注 册:2011-3-21
收藏
得分:0 
哦哦哦哦哦楼主在程序优化啊我就知道n+=2  就不用算偶数了除的时候好像开个方就又能优化一步菜鸟   勿耻
2011-04-11 13:36
河马拔河
Rank: 2
等 级:论坛游民
帖 子:31
专家分:15
注 册:2011-3-21
收藏
得分:0 
另外啊 ,小生有一不情之请望各位给予重视。每当看到大虾牛逼的算法而望洋兴叹之时,多么希望各位给予引导我相信各位大虾都看过C大学教程,能不能像他们一样在下面给些许解释呢,或者 给些注释也行
2011-04-11 13:48
快速回复:尝试列出 2,000,000以下的所有素数
数据加载中...
 
   



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

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