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
学习了
支持