summaryrefslogtreecommitdiff
path: root/euler12.scm
diff options
context:
space:
mode:
authorIru Cai <mytbk920423@gmail.com>2018-05-24 21:39:58 +0800
committerIru Cai <mytbk920423@gmail.com>2018-05-24 21:39:58 +0800
commit1eefd58ca4fdb5d2f51f657bfd70c9a89a4707db (patch)
treeabde0e4da3c7fe138f3874a94d8eb7d0e44c3224 /euler12.scm
downloadproject_euler-1eefd58ca4fdb5d2f51f657bfd70c9a89a4707db.tar.xz
initial commit
Diffstat (limited to 'euler12.scm')
-rw-r--r--euler12.scm41
1 files changed, 41 insertions, 0 deletions
diff --git a/euler12.scm b/euler12.scm
new file mode 100644
index 0000000..e0d726f
--- /dev/null
+++ b/euler12.scm
@@ -0,0 +1,41 @@
+(define (square x) (* x x))
+(define (power x n)
+ (if (= n 0)
+ 1
+ (* x (power x (- n 1)))))
+
+(define (first-divisor x)
+ (define (try-iter d)
+ (cond ((= 0 (remainder x d)) d)
+ ((> (square d) x) x)
+ (else (try-iter (+ d 1)))))
+ (try-iter 2))
+
+(define (divexp x d)
+ (if (= (remainder x d) 0)
+ (+ (divexp (/ x d) d) 1)
+ 0))
+
+(define (ndiv n)
+ (define (pair d)
+ (cons (divexp n d) (/ n (expt d (divexp n d)))))
+ (if (= n 1) 1
+ (let ((fd (first-divisor n)))
+ (* (+ 1 (car (pair fd)))
+ (ndiv (cdr (pair fd)))))))
+
+(define (kth-factor-triangle-over-n n)
+ (define (n-fac-tri n)
+ (if (even? n)
+ (* (ndiv (/ n 2)) (ndiv (+ n 1)))
+ (* (ndiv n) (ndiv (/ (+ n 1) 2)))))
+ (define (try-iter i)
+ (if (> (n-fac-tri i) n)
+ i
+ (try-iter (+ i 1))))
+ (try-iter 1))
+
+(display
+ ((lambda (x) (/ (* x (+ x 1)) 2))
+ (kth-factor-triangle-over-n 500)))
+(newline)