我一直在慢慢地解决 Project Euler 问题的列表,我已经找到了一个我知道如何解决的问题,但似乎我做不到(考虑到我的解决方案的编写方式)。
我正在使用 Common Lisp 来执行此操作,并且我的脚本已经运行了超过 24 小时(远超过他们的一分钟目标)。
为了简洁起见,这是我的解决方案(这是一个剧透,但前提是你有一个非常快的处理器):
(defun square? (num)
(if (integerp (sqrt num)) T))
(defun factors (num)
(let ((l '()))
(do ((current 1 (1+ current)))
((> current (/ num current)))
(if (= 0 (mod num current))
(if (= current (/ num current))
(setf l (append l (list current)))
(setf l (append l (list current (/ num current)))))))
(sort l #'< )))
(defun o_2 (n)
(reduce #'+ (mapcar (lambda (x) (* x x)) (factors n))))
(defun sum-divisor-squares (limit)
(loop for i from 1 to limit when (square? (o_2 i)) summing i))
(defun euler-211 ()
(sum-divisor-squares 64000000))
使用更小、更友好的测试参数解决问题所需的时间似乎比指数级增长……这是一个真正的问题。
花了:
- 0.007 秒解决 100
- 0.107 秒求解 1000
- 2.020 秒解决 10000
- 56.61 秒解决 100000
- 1835.385 秒求解 1000000
- 24+小时解决64000000
我真的想弄清楚脚本的哪些部分导致它需要这么长时间。我已经考虑过记忆因子函数,但我不知道如何实际实现它。
对于那些想看看问题本身的人,在这里。
任何关于如何使这件事变得更快的想法将不胜感激。
**对不起,如果这对任何人来说是一个剧透,它并不意味着......但如果你有计算能力在相当长的时间内运行它,那么你就有更多的能力。