| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3142 人关注过本帖, 2 人收藏
标题:看看我的这个Erastothens有多高效.
只看楼主 加入收藏
iFreeBSD
Rank: 4
等 级:业余侠客
威 望:4
帖 子:474
专家分:236
注 册:2007-11-5
结帖率:100%
收藏(2)
 问题点数:0 回复次数:13 
看看我的这个Erastothens有多高效.
传统的写法.
程序代码:
#include <stdio.h>
#include <math.h>
#define  cnt  50000000
int main(void)
{
    int i;
    int j;
    int a[cnt];               

    for (i = 1; i <= cnt; i++) 
        a[i] = i;

    for (i = 2; i < sqrt(cnt); i++)     
        for (j = i + 1; j <= cnt; j++)  
        {
            if (a[i] != 0 && a[j] != 0) 
                if (a[j] % a[i] == 0)
                    a[j] = 0;           
        }
/*
    int n = 0;    

    for (i = 2; i <= cnt; i++)    
    {
        if (a[i] != 0)
        {
            printf("%-5d", a[i]); 
            n++;
        }
        if (n == 10)
        {
            printf("\n");         
            n = 0;
        }
    }
    printf("\n");
*/
    return 0;
}

我的写法
程序代码:
#include <stdio.h>
#define   cnt  50000000
int uDel(int arry[] , int n) {
    int  i  , val;
    for (i = 0 ; i  < n ; i++ ) {
         if (arry[i] == 0)
             continue ;
         else {
                val = arry[i] ;
               return val ;
         }
    }
}

int main(void) {

    int  arry[cnt] ={0,0};
    int  i , j ;
    for (j = 2 ; j < cnt ; j++ )
         arry[j] = j ;
         
    for (i = uDel(arry,cnt) ; i * i <= cnt ; i = uDel(arry , cnt)) {
         // printf("%d " , i) ;
          for (j = 1 ; j * i < cnt ; j++) 
               arry[j * i] = 0 ;
          
    }
    /* for ( i = 0 ; i < cnt ; i++) 
        if (arry[i] != 0 )
         printf("%d " , arry[i]) ;  
    */
  
  return 0 ;
}

注意上面 cnt 50000000 是我在unix-center上的服务器测试用的,普通的pc的内存早就超出了限制.在你机器上适当的改小.
另外,把输出语句注释掉是应为printf太耗时,这里单纯的比较算法.我在unix-center上的一台freebsd6.2系统上分别运行(数量级50000000)了两个程序,我的在2秒内完成,而传统的写法我等了2分多钟.
收到的鲜花
  • 广陵绝唱2008-12-10 18:29 送鲜花  49朵   附言:原创内容
搜索更多相关主题的帖子: Erastothens 
2008-12-10 18:19
sf469210604
Rank: 1
等 级:新手上路
帖 子:61
专家分:0
注 册:2008-9-26
收藏
得分:0 
敢问这位大大,
"高效"指的是算法吗?
是不是什么O(N)这个东西????????
至于这个程序是干什么的我还要到机子上运行下才知道
2008-12-10 19:11
baidu
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:3811
专家分:0
注 册:2005-11-4
收藏
得分:0 
哈哈,是不是有点曲高而和者寡的感觉?

偶放弃所有文章版权,偶在BCCN论坛任何贴子,可转贴,可散发,可抄袭,可复制,可被冒名顶替,可被任何人引用到任何文章中且不写出引文出处,偶分文不取。
2008-12-10 21:45
baidu
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:3811
专家分:0
注 册:2005-11-4
收藏
得分:0 
另外,悄悄告诉你,你的键盘的"E"键要修理一下了

偶放弃所有文章版权,偶在BCCN论坛任何贴子,可转贴,可散发,可抄袭,可复制,可被冒名顶替,可被任何人引用到任何文章中且不写出引文出处,偶分文不取。
2008-12-10 21:54
rootkit
Rank: 1
等 级:新手上路
帖 子:197
专家分:5
注 册:2008-9-26
收藏
得分:0 
闲着没事干,给你改了下:
程序代码:
#include <stdio.h>
#include <math.h>
#define   N  50000000

int main(void) {

    static int  array[N+1] ={0,1,2};
    int  i , j ,k, mid;

    for (j = 3 ; j < N ; j++ )
        if(j&1)
            array[j] = j ;

    mid = (int)sqrt((double)N);
    for (i = 3; i <= mid; i++) {
        if(!array[i])
            continue;
        k = N / i;
        for (j = 3 ; j < k ; j++)
            array[j * i] = 0 ;         
    }
    
    return 0 ;
}

降妖除魔路,仗剑载酒行
借问谁家子,大唐游侠儿
2008-12-10 22:44
rootkit
Rank: 1
等 级:新手上路
帖 子:197
专家分:5
注 册:2008-9-26
收藏
得分:0 
发现刚才写的比较笨,优化一下:
程序代码:
#include <stdio.h>
#include <math.h>
#define   N  50000000

int main(void) {

    static int  array[N+1] ={0,1,2};
    int  i , j ,k, mid;

    for (j = 3 ; j <= N ; j+=2)
        array[j] = j ;

    mid = (int)sqrt((double)N);
    for (i = 3; i <= mid; ) {        
        k = N / i;
        for (j = 3 ; j < k ; j++)
            array[j * i] = 0 ;  
        while(!array[++i]&&i<=mid)
            NULL;
    }
    
    return 0 ;
}


[[it] 本帖最后由 rootkit 于 2008-12-10 23:38 编辑 [/it]]

降妖除魔路,仗剑载酒行
借问谁家子,大唐游侠儿
2008-12-10 23:32
永夜的极光
Rank: 6Rank: 6
等 级:贵宾
威 望:27
帖 子:2721
专家分:1
注 册:2007-10-9
收藏
得分:0 
我上看下看,左看右看,原来是个筛法求素数。。。。

就是不知道Erastothens是啥意思。。。

从BFS(Breadth First Study)到DFS(Depth First Study)
2008-12-11 07:43
smltq
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:566
专家分:400
注 册:2008-1-21
收藏
得分:0 
我目前只会传统的筛法

简单的生活
2008-12-11 08:23
iFreeBSD
Rank: 4
等 级:业余侠客
威 望:4
帖 子:474
专家分:236
注 册:2007-11-5
收藏
得分:0 
多谢各位捧场.to 老K,你给我买个新的键盘如何

without further ado, let’s get started
2008-12-11 11:21
iFreeBSD
Rank: 4
等 级:业余侠客
威 望:4
帖 子:474
专家分:236
注 册:2007-11-5
收藏
得分:0 
多谢各位捧场.to 老K,你给我买个新的键盘如何

许久不见vxworks了

without further ado, let’s get started
2008-12-11 11:27
快速回复:看看我的这个Erastothens有多高效.
数据加载中...
 
   



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

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