找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 2056|回复: 11

[研讨] 阶乘

[复制链接]

已领礼包: 1883个

财富等级: 堆金积玉

发表于 2016-4-28 20:23:18 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
(defun add (lst1 lst2)
  (setq k1 (length lst1))
  (setq k2 (length lst2))
  (if (> k1 k2)
          (repeat (- k1 k2)  (setq lst2 (cons 0 lst2)) )
          (repeat (- k2 k1)  (setq lst1 (cons 0 lst1)) )
   )
  (setq addlst (mapcar '(lambda (x y) (+ x y)) lst1 lst2 ))
  addlst
)
(defun lnum (lst n n0)
   (setq lst (mapcar '(lambda (x) (* x n))  lst))
   (setq zlst (reverse lst))
   (repeat n0 (setq zlst (cons 0 zlst) ) )
   (reverse zlst)
)  
(defun xc(lst1 lst2)
   (setq n1 (length lst1))
   (setq n2 (length lst2))
   (setq j 1 fflst '(0))
   (if (> n1 n2)
          (while (<= j n2)
              (setq fflst (add (lnum lst1 (nth (- j 1) lst2) (- n2 j) ) fflst))
              (setq j (+ 1 j))
           )
          (while (<= j n1)
              (setq fflst (add (lnum lst2 (nth (- j 1) lst1) (- n1 j) ) fflst))
              (setq j (+ 1 j))
           )
    )
fflst
)
(defun jinw (blst)
    (while (not (apply 'and (mapcar '(lambda (x) (<= x 9)) blst )))
         (setq hlst (mapcar '(lambda (x) (rem x 10)) blst))
         (setq qlst (mapcar '(lambda (x) (/ x 10)) blst))
         (setq qlst (append qlst (list 0)))
         (setq blst (add hlst qlst))
    )
  blst
)
(defun sr(a)
   (setq n (strlen a) i 1 lst nil)
   (while (<= i n)
        (setq lst (cons (atoi (substr a i 1)) lst))
        (setq i (+ 1 i))
   )
   (reverse lst)
)
(defun dc(a b)
  (setq lst1 (sr a))
  (setq lst2 (sr b))
  (setq tenlst (jinw (xc lst1 lst2)))
  (setq str (apply 'strcat (mapcar '(lambda (x) (itoa x)) tenlst ) ) )
  (if (= (car tenlst) 0)
      (setq str (vl-string-left-trim "0" str))
  )
str
)
(defun addone(b)
   (setq lst (sr b))
   (setq tenlst (jinw (add lst '(1))))
   (setq str (apply 'strcat (mapcar '(lambda (x) (itoa x)) tenlst ) ) )
)
(defun ff (a b count)
   (if (= count 0)
        a
        (ff (dc a b) (addone b) (- count 1))
   )
)
(defun f(n)
   (ff "1" "1" n)
)
(f 500)

评分

参与人数 1D豆 +10 贡献 +1 收起 理由
XDSoft + 10 + 1 很给力!经验;技术要点;资料分享奖!

查看全部评分

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

已领礼包: 5604个

财富等级: 富甲天下

发表于 2016-4-29 11:53:35 | 显示全部楼层
(defun tmp (cnt / rtn)
  (setq rtn 1.0)
  (while (> cnt 1)
    (setq rtn (* rtn cnt))
    (setq cnt (1- cnt))
    )
  rtn
  )
;;; (tmp 4)  ===> 24.0
;;; (tmp 5)  ===> 120.0
;;; (tmp 6)  ===> 720.0
;;; (tmp 10)  ===> 3.6288e+006
;;; (tmp 100)  ===> 9.33262e+157

点评

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

使用道具 举报

已领礼包: 19个

财富等级: 恭喜发财

发表于 2016-4-29 13:11:24 | 显示全部楼层
阶乘用递归代码比较简洁吧
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1883个

财富等级: 堆金积玉

 楼主| 发表于 2016-4-29 13:21:28 来自手机 | 显示全部楼层
运行效率和是否溢出均要考虑。能用尾递归就不用普通递归。

点评

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

使用道具 举报

已领礼包: 19个

财富等级: 恭喜发财

发表于 2016-4-29 13:31:10 | 显示全部楼层
aimisiyou 发表于 2016-4-29 13:21
运行效率和是否溢出均要考虑。能用尾递归就不用普通递归。

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

使用道具 举报

已领礼包: 1883个

财富等级: 堆金积玉

 楼主| 发表于 2016-4-29 18:43:53 来自手机 | 显示全部楼层
本帖最后由 aimisiyou 于 2016-4-29 18:46 编辑

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

使用道具 举报

已领礼包: 1883个

财富等级: 堆金积玉

 楼主| 发表于 2016-4-29 18:52:50 | 显示全部楼层
HLCAD 发表于 2016-4-29 11:53
(defun tmp (cnt / rtn)
  (setq rtn 1.0)
  (while (> cnt 1)

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

使用道具 举报

已领礼包: 5604个

财富等级: 富甲天下

发表于 2016-4-30 08:21:55 | 显示全部楼层
最开始没有仔细阅读楼主的程序,后来才发现楼主程序有高深之处。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 859个

财富等级: 财运亨通

发表于 2016-4-30 09:27:44 来自手机 | 显示全部楼层
字符串也有长度限制,分割为一定长度用表保存,大数处理问题

点评

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

使用道具 举报

已领礼包: 1883个

财富等级: 堆金积玉

 楼主| 发表于 2016-4-30 12:32:56 | 显示全部楼层
(defun fen(n)
  (if (= n 1)
      nil
     (if (= (rem n 2) 0)
           (cons (list 2 (/ n 2)) (cons (list (- n 1)) (fen (/ n 2) )))
           (cons (list 2 (/ (- n 1) 2)) (cons (list n) (fen (/ (- n 1) 2))))
      )
  )
)
(defun he(lst)
   (setq sum (apply '+ (vl-remove nil (mapcar '(lambda (x) (if (= (car x) 2) (cadr x) nil))  lst))))
   (setq flst (cons (list 2 sum) (vl-remove nil (mapcar '(lambda (x) (if (= (car x) 2) nil x)) lst ))))
)
(he (fen 1000))
;;;结果为((2 994) (999) (499) (249) (125) (61) (31) (15) (7) (3))
;;;即1000!=2^994*(999*997*995……*3*1)*(499*497*495……*1)……*(3*1)
;;;将相同段数乘积结果保存,会大大减少乘法运算次数
;;;如(999*997*995……*3*1)*(499*497*495……*1)=(999*997*……*501)*(499*497*……3*1)^2
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1883个

财富等级: 堆金积玉

 楼主| 发表于 2016-4-30 12:49:10 | 显示全部楼层
csharp 发表于 2016-4-30 09:27
字符串也有长度限制,分割为一定长度用表保存,大数处理问题

字符串长度限制是多少?

点评

ANSI 兼容性要求编译器在串联后接受字符串中最多 509 个字符。Microsoft C 中允许的字符串的最大长度约为 2,048 个字节。但是,如果字符串由用双引号引起来的多个部分构成,则预处理器会将这些部分串联为一个字符串  详情 回复 发表于 2016-5-1 11:59
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 264个

财富等级: 日进斗金

发表于 2016-5-1 11:59:33 来自手机 | 显示全部楼层
aimisiyou 发表于 2016-4-30 12:49
字符串长度限制是多少?

ANSI 兼容性要求编译器在串联后接受字符串中最多 509 个字符。Microsoft C 中允许的字符串的最大长度约为 2,048 个字节。但是,如果字符串由用双引号引起来的多个部分构成,则预处理器会将这些部分串联为一个字符串,对于串联的每个行,它会将一个额外的字节添加到总字节数。
例如,假设字符串包含 40 个行(其中,每行 50 个字符,共 2,000 个字符)和一个包含 7 个字符的行,并且每个行是由双引号引起来的。所有这些字符共有 2,007 个字节,加上终止 null 字符的 1 个字节,总共为 2,008 个字节。在串联时,为前 40 个行中的每个行添加一个额外字符。这样将共有 2,048 个字节。但请注意,如果使用行继续符 (\) 代替双引号,则预处理器不会为每个行添加一个额外字符。
单个带引号的字符串的长度不能多于 2048 个字节,可以通过串联多个字符串来构造一个长度约为 65535 个字节的字符串。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-22 10:14 , Processed in 0.473405 second(s), 58 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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