找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

[求助] 质数:这是什么lisp,换成AutoLisp是什么模样?

[复制链接]

已领礼包: 40个

财富等级: 招财进宝

发表于 2014-11-10 10:54:04 | 显示全部楼层
本帖最后由 newer 于 2014-11-10 11:04 编辑
/db_自贡黄明儒_ 发表于 2014-11-10 10:16
N版,你上次您给我讲了boole ,这次是不是给我讲讲lsh的用法 ,我在明经和晓东都搜不到呀

看下下面图,明白数的二进位表示就明白了。

下面是数字20左移2位,后面的空位补2个0.

搜狗截图20141110104657.png

点评

图示很明白,(lsh 20 2)就是左移两位后面补0,文字说明就不知道什么意思了。  详情 回复 发表于 2014-11-10 11:31

评分

参与人数 1D豆 +5 收起 理由
/db_自贡黄明儒_ + 5 热心帮忙奖!

查看全部评分

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2014-11-10 10:56:55 | 显示全部楼层
Autolisp 没有 return 函数,效率要打折很多
这是一个 VC  筛选法

#include<stdio.h>
#include<math.h>
#define N 10000001

bool prime[N];

int main()
{
   int i, j;
   for(i=2; i<N; i++)
       if(i%2) prime[i]=true;
       else prime[i]=false;

       for(i=3; i<=sqrt(N); i++)
      {
         if(prime[i])
           for(j=i+i; j<N; j+=i) prime[i]=false;
      }
      for(i=2; i<100; i++)//由于输出将占用太多io时间,所以只输出2-100内的素数。可以把100改为N
        if( prime[i] )printf("%d ",i);
   return 0;
}
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 604个

财富等级: 财运亨通

 楼主| 发表于 2014-11-10 11:31:15 | 显示全部楼层
newer 发表于 2014-11-10 10:54
看下下面图,明白数的二进位表示就明白了。

下面是数字20左移2位,后面的空位补2个0.

图示很明白,(lsh 20 2)就是左移两位后面补0,文字说明就不知道什么意思了。

点评

文字哪里不明白了? 10进制你最熟悉, 十进制的20 左移两位,等于多少? 2000吧, 10进制左移1位,数变大10倍,2位,数变大100倍, 那二进制呢? 十六进制呢?  详情 回复 发表于 2014-11-10 11:34
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2014-11-10 11:34:53 | 显示全部楼层
/db_自贡黄明儒_ 发表于 2014-11-10 11:31
图示很明白,(lsh 20 2)就是左移两位后面补0,文字说明就不知道什么意思了。

文字哪里不明白了?
10进制你最熟悉, 十进制的20 左移两位,等于多少? 2000吧, 10进制左移1位,数变大10倍,2位,数变大100倍,

那二进制呢? 十六进制呢?

点评

10100左移两位1010000,用计算器转换可以看到80,这个你图示说明了。我不知道你的文字说明的含义。  详情 回复 发表于 2014-11-10 11:42
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 604个

财富等级: 财运亨通

 楼主| 发表于 2014-11-10 11:42:51 | 显示全部楼层
本帖最后由 /db_自贡黄明儒_ 于 2014-11-10 11:45 编辑
newer 发表于 2014-11-10 11:34
文字哪里不明白了?
10进制你最熟悉, 十进制的20 左移两位,等于多少? 2000吧, 10进制左移1位,数变 ...

10100左移两位1010000,用计算器转换可以看到80,这个你图示说明了。我不知道你的文字说明的含义。
明白了,你是说20左移2位,直接可以算得80

点评

是滴,移位操作是计算机最快的操作,一个时钟周期就完成了,而乘法操作要很多个时钟周期才能完成。  详情 回复 发表于 2014-11-10 11:50
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2014-11-10 11:50:29 | 显示全部楼层
/db_自贡黄明儒_ 发表于 2014-11-10 11:42
10100左移两位1010000,用计算器转换可以看到80,这个你图示说明了。我不知道你的文字说明的含义。
明白 ...

是滴,移位操作是计算机最快的操作,一个时钟周期就完成了,而乘法操作要很多个时钟周期才能完成。

点评

N版可以开一贴,给大家介绍一下,不然搜索不到,这样更多人会受益。  发表于 2014-11-10 11:58
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 6530个

财富等级: 富甲天下

发表于 2014-11-10 12:59:32 | 显示全部楼层
Free-Lancer 发表于 2014-11-10 10:56
Autolisp 没有 return 函数,效率要打折很多
这是一个 VC  筛选法

上网查了一下,按筛选法写了一段代码,速度的确提高很多:
  1. (defun Sxprime (n / i l m k)
  2. ;  (setq t1 (getvar "cdate"))
  3.   (setq i 3
  4.         l '(3)
  5.   )
  6.   (while (<= i (- n 2))
  7.     (setq i (+ i 2)
  8.           l (cons i l)
  9.     )
  10.   )
  11.   (setq l (reverse l)
  12.         k (car l)
  13.         m (cdr l)
  14.         l ()
  15.   )
  16.   (while (<= k (sqrt n))
  17.     (setq m (vl-remove-if '(lambda (x) (= (rem x k) 0)) m)
  18.           l (cons k l)
  19.           k (car m)
  20.           m (cdr m)
  21.     )
  22.   )
  23.   (append '(2) (reverse l) (list k) m)
  24. ;  (setq tt (- (getvar "cdate") t1))
  25. )

分析速度影响的因素,前面使用的常规方法是后面在前面的结果基础上累加,随着n的增加,时间呈指数递增,而筛选法是前面构建一个大表,随后在此表基础上做减法,所影响是越来越小,所以速度要快,尤其在数值较大时。

点评

仔细阅读学习,简化了一下  详情 回复 发表于 2014-11-11 09:01
上面 VC 代码出处,筛选法效率是可以大大提高的! http://blog.csdn.net/liukehua123/article/details/5482854  详情 回复 发表于 2014-11-10 13:59

评分

参与人数 1D豆 +5 收起 理由
/db_自贡黄明儒_ + 5 我认为第二个是终极版了,还有更好的,得好.

查看全部评分

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2014-11-10 13:59:17 | 显示全部楼层
ll_j 发表于 2014-11-10 12:59
上网查了一下,按筛选法写了一段代码,速度的确提高很多:

分析速度影响的因素,前面使用的常规方法是 ...

上面 VC  代码出处,筛选法效率是可以大大提高的!
http://blog.csdn.net/liukehua123/article/details/5482854



论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 604个

财富等级: 财运亨通

 楼主| 发表于 2014-11-10 14:25:53 | 显示全部楼层
ll_j 发表于 2014-11-10 12:59
上网查了一下,按筛选法写了一段代码,速度的确提高很多:

分析速度影响的因素,前面使用的常规方法是 ...
  1. ;;&#91;功能&#93; 小于n的质数
  2. ;;(Sxprime 100)=>(2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97)
  3. (defun Sxprime (n / I K L LST ROOT)
  4.   ;;  (setq t1 (getvar "cdate"))
  5.   (setq        i 3
  6.         l '(3)
  7.   )
  8.   (while (<= i (- n 2))
  9.     (setq i (+ i 2)
  10.           l (cons i l)
  11.     )
  12.   )
  13.   (setq root (sqrt n))
  14.   (setq l (reverse l))
  15.   (while (and (setq k (car l)) (<= k root))
  16.     (setq l (cdr l))
  17.     (setq l (vl-remove-if '(lambda (x) (= (rem x k) 0)) l))
  18.     (setq lst (cons k lst))
  19.   )
  20.   (append '(2) (reverse lst) l)
  21.   ;;  (setq tt (- (getvar "cdate") t1))
  22. )
我简化了一下,以期望代码看起来更短

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 604个

财富等级: 财运亨通

 楼主| 发表于 2014-11-10 14:32:34 | 显示全部楼层
ll_j 发表于 2014-11-10 12:59
上网查了一下,按筛选法写了一段代码,速度的确提高很多:

分析速度影响的因素,前面使用的常规方法是 ...
  1. ;;&#91;功能&#93; 小于n的质数
  2. ;;(Sxprime 100)=>(2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97)
  3. (defun Sxprime (n / I K L LST ROOT)
  4.   ;;  (setq t1 (getvar "cdate"))
  5.   (setq        i 3
  6.         l '(3)
  7.   )
  8.   (while (<= i (- n 2))
  9.     (setq i (+ i 2)
  10.           l (cons i l)
  11.     )
  12.   )
  13.   (setq root (sqrt n))
  14.   (setq l (reverse l))
  15.   (while (and (setq k (car l)) (<= k root))
  16.     (setq l (cdr l))
  17.     (setq l (vl-remove-if '(lambda (x) (= (rem x k) 0)) l))
  18.     (setq lst (cons k lst))
  19.   )
  20.   (append '(2) (reverse lst) l)
  21.   ;;  (setq tt (- (getvar "cdate") t1))
  22. )
;;我简化了一下,希望代码看起来更短

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 604个

财富等级: 财运亨通

 楼主| 发表于 2014-11-11 09:01:20 | 显示全部楼层
本帖最后由 /db_自贡黄明儒_ 于 2014-11-11 09:13 编辑
ll_j 发表于 2014-11-10 12:59
上网查了一下,按筛选法写了一段代码,速度的确提高很多:

分析速度影响的因素,前面使用的常规方法是 ...

仔细阅读学习,简化了一下
  1. ;;[功能] 小于n的质数
  2. ;;(SPrime 100)=>(2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97)
  3. (defun Sprime (n / I K L LST ROOT)
  4.   ;;  (setq t1 (getvar "cdate"))
  5.   (setq i 1)(setq root (sqrt n))
  6.   (while (<= (setq i (+ i 2)) n) (setq l (cons i l)))
  7.   (setq l (reverse l))  
  8.   (while (and (setq k (car l)) (<= k root))
  9.     (setq l (vl-remove-if '(lambda (x) (= (rem x k) 0)) (cdr l)))
  10.     (setq lst (cons k lst))
  11.   )
  12.   (append '(2) (reverse lst) l)
  13.   ;;  (setq tt (- (getvar "cdate") t1))
  14. )

评分

参与人数 1D豆 +5 收起 理由
ll_j + 5 我只是顺手写写,函数已经快忘得差不多了,.

查看全部评分

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-9-24 18:29 , Processed in 0.391539 second(s), 50 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表