cabinsummer 发表于 2011-11-8 06:19:04

jicqj 发表于 2011-11-5 19:57 大学时候用c语言玩过圆周率 , 但是不能和大师比啊

思路是什么?可以在lisp里尝试一下

czb203 发表于 2011-11-8 17:45:52

看眼界了,希望多来点这种有挑战性的,可以看到更多的大师浮出水面!

cabinsummer 发表于 2011-11-11 19:48:48

遗憾,计算4000位时竟然出错了

cabinsummer 发表于 2011-11-12 09:45:44

cabinsummer 发表于 2011-11-11 19:48 static/image/common/back.gif
遗憾,计算4000位时竟然出错了

找到原因了,不是算法问题,是输出字符串函数的问题。LISP只能处理的字符串最多只能有4096个字符

jicqj 发表于 2011-11-12 16:57:34

cabinsummer 发表于 2011-11-12 09:45 static/image/common/back.gif
找到原因了,不是算法问题,是输出字符串函数的问题。LISP只能处理的字符串最多只能有4096个字符

哇原来如此

VBALISPER 发表于 2011-11-16 21:12:51

小弟不才,搞个最简单的,还是在朋友们的帮助下完成的.先贴上,慢慢搞一个莱布尼兹,再搞马青...
(defun C:uu();密率π=355/113,π=16arctan1/5-4arctan1/239马青公式
(setq fz 355)
(setq fm 113)
(setq n 0)
(setq lpai nil)
(repeat 30       
        (setq shang (fix (/ fz fm)));求商
        (setq fz (rem fz fm));求余数
        (setq lpai(append lpai (list shang)));第一个参数,每一个除法
        (setq fz (* fz 10))
        (setq n (+ n 1))
);repeat
lpai
)
结果:7位小数精度3. 1 4 1 5 9 2 9 2 0 3 5 3 9 8 2 3 0 0 8 8 4 9 5 5 7 5 2 2 1
是表的形式,小数点是我手加上去的.这两步以后再完善.

qjchen 发表于 2011-11-16 23:38:46

问题很有趣,前些日子编了一下,始终比Highflybird兄的外星人代码算法慢许多,采用的是Machin算法,大数计算。一直想改进后再发的,不过近日开始忙碌了,就先到此为止,先发下,以后再慢慢改进吧。
希望cabinsummer多出些有趣的题目来做 :)
;;; By qjchen@gmail.com ,采用Machin算法,不过由于采用了大数计算,速度随n增大急剧下降,
;;; 应该是O(n2)的算法,以后再改进吧,大概只能算800位内时间还能接受,更大的就不要了
;;; 远比不上Highflybird兄的外星人算法
;;; 2011.11.16
(defun q:math:big+(a b n / f i res x)
(setq i (1- n) f 0)
(repeat n
    (if (> (setq x (+ (nth i a) (nth i b) f)) 10000) (setq x (- x 10000) f 1) (setq f 0))
    (setq res (cons x res) i (1- i))
)
res
)

(defun q:math:big-(a b n / f i res x)
(setq i (1- n) f 0)
(repeat n
    (if (< (setq x (- (nth i a) (nth i b) f)) 0) (setq x (+ x 10000) f 1) (setq f 0))
    (setq res (cons x res) i (1- i))
)
res
)

(defun q:math:round(x)
(setq y (fix x))
(if (> (- x y) 0.5) (1+ y) y)
)

(defun q:math:bigdiv(a b n / c f i res x)
(setq i 0 f 0)
(repeat n
    (setq c (+ (nth i a) (* f 10000))
          x (fix (/ (+ c 0.1) b))
          res (cons x res)
          i (1+ i)
          f (rem c b))
)
(reverse res)
)

(defun q:math:bigreci(f b n / c i res x)
(setq res (cons (fix (/ f b)) res)
      f (rem f b)
      i 1)
(while (< i n)
    (setq c (* f 10000)
          x (fix (/ (+ c 0.1) b))
          res (cons x res) i (1+ i) f (rem c b))
)
(reverse res)
)

(defun q:math:inin (v n / res)
(repeat (1- n)
    (setq res (cons 0 res))
)
(cons v res)
)

(defun q:pi:deal1(a b / i n1 n2 res)
(setq n1 (length a) n2 (length b) res b i 0)
(if (< n2 n1)
   (repeat (- n1 n2)
       (setq res (append res (list (nth (+ n2 i) a))) i (1+ i))
   )
)
res
)

(defun q:math:arctg(k v zf N / i n2)
(setq i (q:math:round (/ (* N 23.1) (/ (log (* k k)) (log 10)))) nn i)
(while (>= i 0)
    (setq n2 (1+ (q:math:round (/ (* (- nn i) N) nn))))
    (if (> n2 N) (setq n2 N))
    (setq c (q:math:bigreci v (1+ (* 2 i)) n2)
          b1 (q:math:bigdiv b (* k k) n2)
          b (q:pi:deal1 b b1)
          b2 (q:math:big- c b n2)
          b (q:pi:deal1 b b2)
          i (1- i))
)
(setq b (q:math:bigdiv b k N))
(if (> zf 0) (setq a (q:math:big+a b N)) (setq a (q:math:big- a b N)) )

)

(defun c:test( / n x x1 x2)
(setq N (getint "\n请输入所需的PI的位数(4的倍数):") N (+ 2 (fix (/ N 4)))
      a (q:math:inin 0 N)
      b (q:math:inin 0 N)
      x1 (q:math:arctg 5 16 1 N)
      x2 (q:math:arctg 239 4 -1 N))
(princ "\n")
(foreach x (reverse (cdr (reverse a))) (princ x))
(princ)
)


(princ "\n By qjchen@gmail.com, 算Pi,命令test")
(princ)

cabinsummer 发表于 2011-11-17 06:14:44

qjchen 发表于 2011-11-16 23:38 static/image/common/back.gif
问题很有趣,前些日子编了一下,始终比Highflybird兄的外星人代码算法慢许多,采用的是Machin算法,大数计算 ...

你的方法和我的方法大同小异,如果没有对稀疏数据的优化,速度是不可能提很快的。同样的算法,在VB上运行比LISP上快10倍以上。

cabinsummer 发表于 2011-11-17 06:17:54

qjchen 发表于 2011-11-16 23:38 static/image/common/back.gif
问题很有趣,前些日子编了一下,始终比Highflybird兄的外星人代码算法慢许多,采用的是Machin算法,大数计算 ...

qjchen兄可以去挑战一下第二季,光路计算
http://bbs.mjtd.com/thread-90226-1-1.html

zqb05 发表于 2011-11-20 17:20:30

学习了
支持
页: 1 2 3 [4] 5
查看完整版本: [风之影][Lisp大挑战第一季]圆周率