我记得有一次Srinivasa Ramanujan在普特尼生病时去看他。我坐过1729号出租车,说这个号码在我看来相当乏味,我希望这不是一个不利的预兆。“不,”他回答说,“这是一个非常有趣的数字,它是用两种不同方式表示的两个立方体之和的最小数字。”[G. H. Hardy如1729年(编号)中所述]
约瑟夫·塔塔科夫斯基( Joseph )在““数学之怒””中谈到了这一壮举:
那又怎么样?给我两分钟和我的计算器手表,我也会做同样的事,而不会产生任何小的灰色细胞。
我不知道Tartakovsky先生如何在计算器表上完成这个证明,但下面是我的方案函数,它从1开始枚举数字,当它找到一个可以用两种不同方式表示的数字时,它会将两个正数的立方体相加。它的回报是1729年。
我希望在两个方面提出改进建议。其中一个方面是,新的计划,风格和成语。另一个区域是在计算的周围。Sisc不返回根的确切数字,即使它们可能是。
例如,(expt 27 1/3)产生2.9999999999999996。但是我确实得到了精确的结果,当计算一个精确的数字时,(expt 3 3)产生27。我的解决方案是得到一个立方体根的确切地板,然后对地板的立方体和地板的立方体加上一个立方体进行测试,如果匹配的话,计算为匹配。这个解决方案似乎很混乱,也很难解释。有没有更直截了当的方法?
; Find the Hardy-Ramanujan number, which is the smallest positive
; integer that is the sum of the cubes of two positivie integers in
; two seperate ways.
(define (hardy-ramanujan-number)
(let ((how-many-sum-of-2-positive-cubes
; while i^3 + 1 < n/1
; tmp := exact_floor(cube-root(n - i^3))
; if n = i^3 + tmp^3 or n = i^3 + (tmp + 1) ^3 then count := count + 1
; return count
(lambda (n)
(let ((cube (lambda (n) (expt n 3)))
(cube-root (lambda (n) (inexact->exact (expt n 1/3)))))
(let iter ((i 1) (count 0))
(if (> (+ (expt i 3) 1) (/ n 2))
count
(let* ((cube-i (cube i))
(tmp (floor (cube-root (- n cube-i)))))
(iter (+ i 1)
(+ count
(if (or (= n (+ cube-i (cube tmp)))
(= n (+ cube-i (cube (+ tmp 1)))))
1
0))))))))))
(let iter ((n 1))
(if (= (how-many-sum-of-2-positive-cubes n) 2)
n
(iter (+ 1 n))))))发布于 2011-04-30 01:24:52
您的代码看起来很好,我看到一些非常小的事情需要评论:
cube和cube-root,define作为内部函数使它看起来更加清晰,inexact->exact,这会导致大的理性主义(在你分配两个大整数的意义上) --最好避免这样做,round,然后做一次检查,省去一次测试。修复上面的内容,并在找到数字时返回数字的一个函数中这样做,并使用一些更“明显”的标识符名,我得到如下信息:
(define (hardy-ramanujan-number n)
(define (cube n) (expt n 3))
(define (cube-root n) (inexact->exact (round (expt n 1/3))))
(let iter ([i 1] [count 0])
(if (> (+ (cube i) 1) (/ n 2))
(hardy-ramanujan-number (+ n 1))
(let* ([i^3 (cube i)]
[j^3 (cube (cube-root (- n i^3)))]
[count (if (= n (+ i^3 j^3)) (+ count 1) count)])
(if (= count 2) n (iter (+ i 1) count))))))我在球拍上运行这个,看起来速度快了10倍(50毫秒比5毫秒)。
https://codereview.stackexchange.com/questions/2162
复制相似问题