免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: xiaozhu2007
打印 上一主题 下一主题

[C] 求2~2000的所有素数.有足够的内存,要求尽量快 [复制链接]

论坛徽章:
0
21 [报告]
发表于 2008-09-22 00:20 |只看该作者
原帖由 haoji 于 2008-9-22 00:06 发表
看来,在百万以内的数字范围,查表法比其他方法效率要高。


甚至在64位大内存系统上面,在上亿范围的数字内,查表永远效率最高。


跑题了,因为题目是要找出2000以内所有的素数,实际上考的就是生成这样一张表的算法

论坛徽章:
0
22 [报告]
发表于 2008-09-22 10:23 |只看该作者
原帖由 ytl 于 2008-9-22 00:20 发表


跑题了,因为题目是要找出2000以内所有的素数,实际上考的就是生成这样一张表的算法


如果为了建立表,2000以内质数的搜索的算法没有必要被讨论,用最笨的搜索法也没关系,时间也不会差到1毫秒。
最关键还是如何方便地建立表,和高效地使用表。
没必要因为楼主的题目而限制了思维。

论坛徽章:
0
23 [报告]
发表于 2008-09-22 10:30 |只看该作者
原帖由 haoji 于 2008-9-22 10:23 发表


如果为了建立表,2000以内质数的搜索的算法没有必要被讨论,用最笨的搜索法也没关系,时间也不会差到1毫秒。
最关键还是如何方便地建立表,和高效地使用表。
没必要因为楼主的题目而限制了思维。


既然承认最关键是建表,所以不能用查表法。
2000个数不是关键,因为这只是算法题而已,考的是算法。如果不是考察算法,确实没必要被讨论,相信很多数学家早就手工计算过了,直接拿来用就是了,为什么要编程序用计算机搜索?

[ 本帖最后由 ytl 于 2008-9-22 10:40 编辑 ]

论坛徽章:
0
24 [报告]
发表于 2008-09-24 09:00 |只看该作者
很好的贴子,来学习

论坛徽章:
0
25 [报告]
发表于 2008-09-25 10:46 |只看该作者
#include <stdio.h>
#include <math.h>

#define N 2000

void main(void)
{
        int i, j, cnt, tag; // tag变量是用来判断是否素数的标志
        int a[N]; // 开辟数组,存放素数

        a[0] = 2;       
        cnt = 1;
        // 除2以外,所有的素数都是奇数,因此从3开始,可以减少一半的计算量。
        for ( i = 3; i < N; i += 2)
        {
                tag = 1;
                for ( j = 2; j <= sqrt(i); j++ )
                {
                        if ( i%j == 0 )
                        {
                                tag = 0;
                                break;
                        }
                }
                if ( tag ) a[cnt++] = i;

        }

        printf("%d以内的素数(共计%d个)如下:\n", N, cnt);
        for ( i = 0; i < cnt; i++ )
        {
                printf("%-6d", a);
                if ( (i+1)%10 == 0 ) printf("\n");
        }
        printf("\n]");

}

论坛徽章:
0
26 [报告]
发表于 2008-09-25 10:57 |只看该作者
编程就得务实,理论很抽象,实践是最要的。再快的算法,也得逐个判断,这是必须的。计算机是机器不是人,怎么做得我们告诉它,自己能做的千万别交给机器去做,程序员实在做不了的再交给机器做,一定能求解出最优算法。

论坛徽章:
0
27 [报告]
发表于 2008-09-26 10:30 |只看该作者
筛法选素数.

论坛徽章:
0
28 [报告]
发表于 2012-09-07 10:10 |只看该作者
for(int i=0;i<=find;i++)
应该改为i<find。
另外最好不要用find吧,在C/C++里有find函数,这样在for里面会觉得“模糊”。

论坛徽章:
36
子鼠
日期:2013-08-28 22:23:29黄金圣斗士
日期:2015-12-01 11:37:51程序设计版块每日发帖之星
日期:2015-12-14 06:20:00CU十四周年纪念徽章
日期:2015-12-22 16:50:40IT运维版块每日发帖之星
日期:2016-01-25 06:20:0015-16赛季CBA联赛之深圳
日期:2016-01-27 10:31:172016猴年福章徽章
日期:2016-02-18 15:30:3415-16赛季CBA联赛之福建
日期:2016-04-07 11:25:2215-16赛季CBA联赛之青岛
日期:2016-04-29 18:02:5915-16赛季CBA联赛之北控
日期:2016-06-20 17:38:50技术图书徽章
日期:2016-07-19 13:54:03程序设计版块每日发帖之星
日期:2016-08-21 06:20:00
29 [报告]
发表于 2012-09-07 10:58 |只看该作者
本帖最后由 cokeboL 于 2012-09-07 11:01 编辑

查表是神马。。

论坛徽章:
36
子鼠
日期:2013-08-28 22:23:29黄金圣斗士
日期:2015-12-01 11:37:51程序设计版块每日发帖之星
日期:2015-12-14 06:20:00CU十四周年纪念徽章
日期:2015-12-22 16:50:40IT运维版块每日发帖之星
日期:2016-01-25 06:20:0015-16赛季CBA联赛之深圳
日期:2016-01-27 10:31:172016猴年福章徽章
日期:2016-02-18 15:30:3415-16赛季CBA联赛之福建
日期:2016-04-07 11:25:2215-16赛季CBA联赛之青岛
日期:2016-04-29 18:02:5915-16赛季CBA联赛之北控
日期:2016-06-20 17:38:50技术图书徽章
日期:2016-07-19 13:54:03程序设计版块每日发帖之星
日期:2016-08-21 06:20:00
30 [报告]
发表于 2012-09-07 11:08 |只看该作者
本帖最后由 cokeboL 于 2012-09-07 15:53 编辑

楼主给的答案明显是错误代码,我写了个不用查表的:
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. #include <unistd.h>
  5. #include <math.h>

  6. char is_prime(int n)
  7. {
  8.     int i=2;
  9.     if(2 == n)
  10.         return 1;
  11.     while(i < sqrt(n)){
  12.         if(!(n % i))
  13.             return 0;
  14.         i++;
  15.     }

  16.     return 1;
  17. }

  18. void find_prime(int max)
  19. {
  20.     int i, j, tmp;
  21.     char *p = (char*)calloc(max, 1);
  22.     p[0] = -1;
  23.     for(i = 2; i <= max; i++){
  24.         if(-1 == p[i-1]){
  25.             continue;
  26.         }
  27.         if(is_prime(i)){
  28.             for(j = 2; (tmp = i * j) <= max; j++){
  29.                 p[tmp-1] = -1;
  30.             }
  31.         }
  32.     }
  33.     j = 0;
  34.     for(i = 2; i <= max; i++){
  35.         if(p[i-1] != -1){
  36.             printf("%10d%c", i, (0==(++j%10))?'\n':' ');
  37.         }
  38.     }
  39.     printf("\n");
  40.     free(p);
  41. }

  42. int main(int argc, char *argv[])
  43. {
  44.     find_prime(atoi(argv[1]));
  45.     return 0;
  46. }
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP