免费注册 查看新帖 |

Chinaunix

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

[原创] 静态质数表生成函数 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-09-22 19:10 |只看该作者 |倒序浏览
判断一个数是否是质数,经过实验,即使在2千万的范围内,还是查表的速度更快,占用内存也不多,即使2千万的位序列也不过占2M左右的内存。

写了一个程序,自动生成一个静态表函数。


  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <limits.h>
  4. #include <math.h>

  5. int main(int argc, char** argv)
  6. {
  7.   int total=2000;
  8.   int cols=6;
  9.   int myjs=1;
  10.   
  11.   if(argc>2)
  12.   {
  13.      fprintf(stderr,"Usage:%s total\n",argv[0]);
  14.      return -1;
  15.   }
  16.   else if(argc==2)
  17.      total=(int)strtol(argv[1],NULL,10);
  18.   

  19.   int js=3;
  20.   int i;
  21.   int t;

  22.   printf("int myadjust(int shu)\n\
  23. {\n\
  24.     assert(shu<=%d);\n\
  25.     const static unsigned int mytable[]={\n\
  26.             ",total);

  27.   unsigned int output=0x60000000;

  28.   for(t=3;t<=total;t++)
  29.   {
  30.     int k=(int)(sqrt(t));
  31.     if(t%2==0)
  32.       i=0;
  33.     else
  34.       for(i=3;i<=k;i+=2)
  35.        if(t%i==0)
  36.           break;
  37.     if(i>k)
  38.       output|=(0x80000000 >> (js & 0x1F));
  39.    
  40.     if((js & 0x1F) == 31)
  41.     {
  42.       printf("0x%X,",output);
  43.       output=0;
  44.       if(myjs++ % cols ==0)
  45.         printf("\n\
  46.             ");
  47.     }
  48.    
  49.     js++;
  50.   }

  51.   if((--js & 0x1F) != 31)
  52.     printf("0x%X\n",output);  

  53.   printf("    };\n\n    return (mytable[shu >> 5] & ((unsigned int)0x80000000 >> (shu & 0x1F)));\n}\n");

  54.   return 0;
  55. }

复制代码



比如生成的0-2000范围内的质数表函数(内置位序列,0为false,非0为true,判断质数):


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

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


复制代码

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

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
2 [报告]
发表于 2008-09-22 19:29 |只看该作者
好东西,有时间测试一下。
BTW,代码里怎么那么多\n啊

论坛徽章:
0
3 [报告]
发表于 2008-09-22 19:51 |只看该作者
原帖由 Godbach 于 2008-9-22 19:29 发表
好东西,有时间测试一下。
BTW,代码里怎么那么多\n啊


为了美观,

谢谢鼓励

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
4 [报告]
发表于 2008-09-22 20:07 |只看该作者
呵呵,都是包含在printf里面。

论坛徽章:
0
5 [报告]
发表于 2008-09-22 20:12 |只看该作者

回复 #1 haoji 的帖子

恩,不错,我来学习一下哦,呵呵呵

论坛徽章:
0
6 [报告]
发表于 2008-09-23 09:44 |只看该作者
费劲啊,为什么不用 bitset

论坛徽章:
0
7 [报告]
发表于 2008-09-23 12:12 |只看该作者
什么跟什么呀。看不出快在那里?

论坛徽章:
0
8 [报告]
发表于 2008-09-23 16:35 |只看该作者
原帖由 redspider 于 2008-9-23 09:44 发表
费劲啊,为什么不用 bitset


费劲吗?一行语句还费劲?

论坛徽章:
0
9 [报告]
发表于 2008-09-23 16:36 |只看该作者
原帖由 RobinHoo 于 2008-9-23 12:12 发表
什么跟什么呀。看不出快在那里?


没实验过就别乱说

论坛徽章:
0
10 [报告]
发表于 2008-09-23 17:00 |只看该作者
老大,能否注释下,照顾下我们
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP