免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
11 [报告]
发表于 2008-09-21 14:57 |只看该作者
还是查表快


  1. int myadjust(int shu)
  2. {
  3.    
  4.    static char mytable[]={
  5.         1,0,0,0,1,0,1,0,1,1,1,0,1,0,1,1,1,0,1,0,1,1,1,0,1,1,1,1,1,0,1,0,1,1,1,1,1,0,1,1,
  6.         1,0,1,0,1,1,1,0,1,1,1,1,1,0,1,1,1,1,1,0,1,0,1,1,1,1,1,0,1,1,1,0,1,0,1,1,1,1,1,0,
  7.         1,1,1,0,1,1,1,1,1,0,1,1,1,1,1,1,1,0,1,1,1,0,1,0,1,1,1,0,1,0,1,1,1,0,1,1,1,1,1,1,
  8.         1,1,1,1,1,1,1,0,1,1,1,0,1,1,1,1,1,0,1,0,1,1,1,1,1,1,1,1,1,0,1,0,1,1,1,1,1,0,1,1,
  9.         1,1,1,0,1,1,1,0,1,1,1,1,1,0,1,1,1,1,1,0,1,0,1,1,1,1,1,1,1,1,1,0,1,0,1,1,1,0,1,0,
  10.         1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,0,1,0,1,1,1,0,1,1,1,1,1,0,
  11.         1,0,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,0,1,1,1,1,1,0,1,1,1,1,1,0,1,0,1,1,1,1,1,0,1,1,
  12.         1,0,1,0,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,0,1,0,1,1,1,0,1,1,
  13.         1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,0,1,0,1,1,1,0,1,1,1,1,1,0,
  14.         1,1,1,1,1,1,1,0,1,1,1,1,1,0,1,1,1,1,1,0,1,1,1,0,1,1,1,1,1,0,1,1,1,1,1,1,1,0,1,1,
  15.         1,0,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,0,1,0,1,1,1,1,1,1,1,1,1,0,1,0,1,1,1,1,1,0,
  16.         1,1,1,0,1,1,1,1,1,0,1,1,1,1,1,1,1,0,1,1,1,0,1,0,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,0,
  17.         1,1,1,1,1,1,1,0,1,1,1,0,1,1,1,1,1,1,1,0,1,1,1,0,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,
  18.         1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,0,1,1,
  19.         1,1,1,0,1,1,1,1,1,0,1,0,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,0,1,1,1,1,1,0,
  20.         1,0,1,1,1,1,1,0,1,1,1,1,1,0,1,1,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,
  21.         1,0,1,0,1,1,1,0,1,1,1,1,1,0,1,1,1,1,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,0,1,1,
  22.         1,1,1,0,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,0,
  23.         1,1,1,1,1,1,1,0,1,1,1,1,1,0,1,1,1,1,1,0,1,1,1,0,1,1,1,1,1,1,1,0,1,1,1,1,1,0,1,1,
  24.         1,0,1,1,1,1,1,1,1,0,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,0,1,1,
  25.         1,1,1,1,1,1,1,1,1,0,1,0,1,1,1,1,1,1,1,1,1,0,1,0,1,1,1,0,1,0,1,1,1,1,1,1,1,1,1,0,
  26.         1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,0,1,0,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,
  27.         1,0,1,0,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,0,1,1,1,1,1,1,1,0,
  28.         1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,0,1,1,1,0,1,1,1,1,1,0,1,1,1,1,1,0,1,1,1,1,1,1,
  29.         1,1,1,1,1,1,1,0,1,1,1,0,1,1,1,1,1,0,1,1,1,1,1,0,1,1,1,1,1,1,1,0,1,1,1,1,1,0,1,1,
  30.         1,1,1,1,1,1,1,1,1,0,1,1,1,0,1,1,1,1,1,0,1,0,1,1,1,1,1,1,1,1,1,0,1,0,1,1,1,1,1,0,
  31.         1,1,1,1,1,1,1,1,1,0,1,0,1,1,1,1,1,1,1,1,1,0,1,0,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,
  32.         1,1,1,1,1,1,1,0,1,1,1,0,1,0,1,1,1,0,1,1,1,1,1,0,1,1,1,1,1,0,1,1,1,1,1,1,1,0,1,1,
  33.         1,1,1,0,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,1,1,1,1,
  34.         1,1,1,0,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,0,1,1,1,1,1,0,1,1,1,1,1,1,
  35.         1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,0,1,1,1,1,1,0,1,1,1,1,1,0,1,0,1,1,1,1,1,0,1,1,
  36.         1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,
  37.         1,1,1,0,1,1,1,1,1,0,1,0,1,1,1,1,1,0,1,1,1,0,1,0,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,0,
  38.         1,0,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
  39.         1,0,1,1,1,1,1,0,1,1,1,1,1,0,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,
  40.         1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,0,1,0,1,1,1,0,1,1,1,1,1,0,
  41.         1,1,1,1,1,1,1,0,1,1,1,0,1,0,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,
  42.         1,0,1,0,1,1,1,0,1,0,1,1,1,0,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,
  43.         1,1,1,0,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,0,1,1,1,0,1,1,1,1,1,0,
  44.         1,1,1,1,1,1,1,0,1,1,1,0,1,1,1,1,1,1,1,0,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,
  45.         1,0,1,1,1,1,1,0,1,0,1,1,1,0,1,1,1,1,1,0,1,0,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,0,1,1,
  46.         1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,0,1,1,1,0,1,0,1,1,1,1,1,1,1,1,1,1,
  47.         1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,0,1,0,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,
  48.         1,0,1,0,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,0,1,1,1,1,1,0,1,1,1,1,1,0,1,1,1,1,1,0,
  49.         1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,0,1,1,1,0,1,0,1,1,1,1,1,1,1,1,1,1,
  50.         1,0,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,
  51.         1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,0,1,1,1,0,1,0,1,1,1,0,1,0,
  52.         1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,0,1,1,1,1,1,0,1,1,1,1,1,1,
  53.         1,1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,1,1,1,1,1,1,
  54.         1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,0,1,1,1,1,1,1,1,0,1,1,1,1,1,0,1,1,1,0,1,0,1
  55.         };

  56.    return mytable[shu];
  57. }



复制代码

[ 本帖最后由 haoji 于 2008-9-21 15:07 编辑 ]

论坛徽章:
0
12 [报告]
发表于 2008-09-21 15:06 |只看该作者
原帖由 haoji 于 2008-9-21 14:57 发表
还是查表快


int myadjust(int shu)
{
   
   static char mytable[]={1,0,0,0,1,0,1,0,1,1,1,0,1,0,1,1,1,0,1,0,1,1,1,0,1,1,1,1,1,0,1,0,1,1,1,1,1,0,1,1,1,0,1,0,1,1,1,0,1,1,1,1,1,0,1,1,1,1,1,0,1 ...


题目就是让你生成这张表啊!

论坛徽章:
0
13 [报告]
发表于 2008-09-21 15:09 |只看该作者
原帖由 ytl 于 2008-9-21 15:06 发表


题目就是让你生成这张表啊!



  1. #include <stdio.h>

  2. int main()
  3. {
  4.   int total=2000;
  5.   int i;
  6.   int t;
  7.   printf("static char mytable[]={1,0,0,");
  8.   for(t=3;t<=total;t++)
  9.   {
  10.     int k=t/2;
  11.     for(i=2;i<=k;i++)
  12.      if((t/i)*i==t)
  13.         break;
  14.     if(i==k+1)
  15.       printf("0",t);
  16.     else
  17.       printf("1",t);
  18.     if(t<total)
  19.       printf(",");
  20.   }
  21.   printf("};\n");
  22.   return 0;
  23. }
复制代码

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
14 [报告]
发表于 2008-09-21 15:43 |只看该作者
原帖由 haoji 于 2008-9-21 15:09 发表




#include

int main()
{
  int total=2000;
  int i;
  int t;
  printf("static char mytable[]={1,0,0,");
  for(t=3;t

生成这样一张静态的表供C语言使用,我一般还是借助脚本:

  1. #!/bin/awk -f
  2. {
  3.         x=$1;
  4.         printf("static int mytable[]={")
  5.         for(i=0;i<=x;i++)
  6.                 a[i]=1;
  7.         a[0]=a[1]=0;
  8.         y=int(sqrt($1));
  9.         for(j=2;j<=x;j++) {
  10.                 for(k=j+j;k<=x;k+=j){
  11.                         a[k]=0;
  12.                 }
  13.         }
  14.         for(i=0;i<=x;i++)
  15.                 printf("%d,",a[i]);
  16.         printf("};\n");
  17.         exit
  18. }
复制代码

刚才写的有问题,现在改了

[ 本帖最后由 cjaizss 于 2008-9-21 21:26 编辑 ]

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
15 [报告]
发表于 2008-09-21 15:45 |只看该作者
Haskell的递归功能强大,描述性很强,我也打算用这种方法来描述,可是了解的计算机硬软件语言太多,实在害怕混淆。

论坛徽章:
0
16 [报告]
发表于 2008-09-21 15:47 |只看该作者
原帖由 cjaizss 于 2008-9-21 15:43 发表

生成这样一张静态的表供C语言使用,我一般还是借助脚本:

#!/bin/awk -f
{
        x=$1;
        printf("static int mytable[]={")
        for(i=0;i



非常同意,静态的表的生成程序,最主要的还是强调开发效率,对于运行效率则没必要过度强调。
脚本是非常好的选择。

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
17 [报告]
发表于 2008-09-21 17:35 |只看该作者
原帖由 cjaizss 于 2008-9-21 15:45 发表
Haskell的递归功能强大,描述性很强,

单就这个问题来说,不光递归在起作用,还有更为关键的是 Haskell 的 lazy evolution 的特性,primes 实际是一个 prime stream (所有素数的流),没有 lazy evolution 这是不可能的。

论坛徽章:
0
18 [报告]
发表于 2008-09-21 18:08 |只看该作者
原帖由 cjaizss 于 2008-9-21 15:43 发表

生成这样一张静态的表供C语言使用,我一般还是借助脚本:

#!/bin/awk -f
{
        x=$1;
        printf("static int mytable[]={")
        for(i=0;i


1. 偶数的情况不对
2. 这句循环的上限应该是y: for(j=3;j<=y;j+=2) {

论坛徽章:
0
19 [报告]
发表于 2008-09-22 00:03 |只看该作者
更紧密的表


  1. #include <stdio.h>

  2. int myadjust(int shu)
  3. {
  4.     const static unsigned int mytable[]={
  5.       0x75145105, 0x4510414, 0x11411040, 0x45144001, 0x10500504,  
  6.       0x11041401, 0x45001001, 0x14414010, 0x41050450, 0x4001144,  
  7.       0x104014, 0x41010411, 0x4044040, 0x14014110, 0x40451001,  
  8.       0x1101104, 0x500004, 0x10041050, 0x40104141, 0x4500100,  
  9.       0x51041400, 0x44101004, 0x4010104, 0x11010440, 0x44001004,  
  10.       0x500514, 0x1000451, 0x45100, 0x110100, 0x40441040,  
  11.       0x1104101, 0x4004414, 0x1410050, 0x5040001, 0x14410404,  
  12.       0x10400001, 0x40101004, 0x10404004, 0x41050400, 0x40100005,  
  13.       0x10504510, 0x1410000, 0x4104, 0x4000100, 0x40011441,  
  14.       0x1141001, 0x514410, 0x1001010, 0x1044101, 0x10110004,  
  15.       0x41441410, 0x4000041, 0x14000004, 0x50040050, 0x4041041,  
  16.       0x4114, 0x401001, 0x1000100, 0x4114500, 0x40041040,  
  17.       0x140005, 0x410, 0x10450000
  18.     };

  19.    return (mytable[shu >> 5] & ((unsigned int)0x80000000 >> (shu & 0x1F)));

  20. }

  21. int main()
  22. {
  23.    int i;
  24.    for(i=1;i<=2000;i++)
  25.      if(myadjust(i))
  26.        printf("%d is prime number.\n",i);

  27.    return 0;
  28. }

复制代码

[ 本帖最后由 haoji 于 2008-9-22 18:21 编辑 ]

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


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

[ 本帖最后由 haoji 于 2008-9-22 00:12 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP