免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
1234下一页
最近访问板块 发新帖
查看: 17415 | 回复: 37
打印 上一主题 下一主题

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

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-09-20 20:16 |只看该作者 |正序浏览
求2~2000的所有素数.有足够的内存,要求尽量快

答案:
int findvalue[2000]={2};
static int find=1;
bool adjust(int value)
{
assert(value>=2);
if(value==2) return true;
for(int i=0;i<=find;i++)
{
if(value%findvalue==0)
return false;
}
findvalue[find++];
return true;
}

没看明白,谁给讲讲,3ks!

论坛徽章:
0
38 [报告]
发表于 2012-09-07 22:41 |只看该作者
本帖最后由 su_787910081 于 2012-09-07 22:45 编辑

楼主不是已经有了代码了吗?
他的意思不是说没弄明白那代码是怎么来的吗?
怎么全都自己另外去写了啊.  
楼主的那个算法非常地道啊.  
我做了一些改动.

#include <stdio.h>
#include <assert.h>

static int findvalue[2000] = {2}; // 2是偶数, 但是素数.所以把他直接放进去,提高一下效率
static int ind=1;                        //  这个是下标,  下一个素数放在  findvalue[ind]   里面
void prime(int value);                 //  函数声明   判断  value 是不是素数, 如果是放到数组里

int main()
{
        int  i=3;
        while(i<=2000){
                 prime(i);
                 i  +=  2;
        }

        //将数组里面的素数打印出来, 每10个换一行
        for(i=0;  i<ind;  i++){
                  printf("%4d ",  findvalue);
                  if((i+1)%10  ==  0) {  printf("\n");  }
        }
        return 0;
}

         /************************************************
           *    下面那个函数就是判断传入的参数是否是素数,   
           *    只要这个参数被现在数组里的任一一个素数整除,   
           *    则说明他不是素数;   
           *    反之, 说明他就是素数.   
           *    既然是素数就把它放到数组里.   
           *    ind  是下标, 同时它还记录了这个数组里一共存放了多少个素数.
           ***********************************************/
void   prime( int   value){
          assert( value>2);
          int  i;

          for( i=0;  i<ind;  i++){
                    if(value%findvalue == 0) { return ;}
          }
          findvalue[ind++] = value;
}



论坛徽章:
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
37 [报告]
发表于 2012-09-07 15:32 |只看该作者
回复 34# sacry


    看了下介绍,刚好我的代码就用的这个方法,俺是文科,以前没碰到过这,嘿嘿

论坛徽章:
0
36 [报告]
发表于 2012-09-07 15:26 |只看该作者
传说中的打表。

论坛徽章:
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
35 [报告]
发表于 2012-09-07 15:09 |只看该作者
回复 34# sacry


    3ks~

论坛徽章:
0
34 [报告]
发表于 2012-09-07 11:43 |只看该作者
回复 32# cokeboL

http://en.wikipedia.org/wiki/Sieve_of_Eratosthenes#Implementation

他们说的是这个。

   

论坛徽章:
23
双鱼座
日期:2013-08-30 09:25:19辰龙
日期:2014-07-28 11:22:24白羊座
日期:2014-08-26 10:34:1815-16赛季CBA联赛之浙江
日期:2016-03-15 10:51:5415-16赛季CBA联赛之八一
日期:2016-05-31 09:38:3615-16赛季CBA联赛之辽宁
日期:2017-08-31 14:59:2115-16赛季CBA联赛之辽宁
日期:2017-12-06 14:12:3615-16赛季CBA联赛之天津
日期:2019-01-02 15:25:4915-16赛季CBA联赛之深圳
日期:2020-12-06 11:26:21狮子座
日期:2014-05-19 09:16:35技术图书徽章
日期:2014-03-27 13:37:39技术图书徽章
日期:2013-08-30 09:28:52
33 [报告]
发表于 2012-09-07 11:35 |只看该作者
xiaozhu2007 发表于 2008-09-20 20:16
求2~2000的所有素数.有足够的内存,要求尽量快

答案:

楼主,你的答案我也没整明白

论坛徽章:
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
32 [报告]
发表于 2012-09-07 11:20 |只看该作者
而且楼上大部分说查表的人都没仔细理解题目,说找到2000以内所有的,他们都是找到一个,题目没回答全。

即使是用查表,只要生成素数表,非素数的没必要放到里面;然后通过二分查找之类的找到素数表内的下标范围,然后取出来才是最终答案。

论坛徽章:
0
31 [报告]
发表于 2012-09-07 11:08 |只看该作者
ytl 发表于 2008-09-22 10:30
既然承认最关键是建表,所以不能用查表法。
2000个数不是关键,因为这只是算法题而已,考的是算法。如 ...

直接拿来用最快

论坛徽章:
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