summaryrefslogtreecommitdiff
path: root/euler14.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 /euler14.scm
downloadproject_euler-1eefd58ca4fdb5d2f51f657bfd70c9a89a4707db.tar.xz
initial commit
Diffstat (limited to 'euler14.scm')
-rw-r--r--euler14.scm28
1 files changed, 28 insertions, 0 deletions
diff --git a/euler14.scm b/euler14.scm
new file mode 100644
index 0000000..3adc07a
--- /dev/null
+++ b/euler14.scm
@@ -0,0 +1,28 @@
+(define (chainlen n)
+ (define (next m)
+ (if (even? m)
+ (/ m 2)
+ (+ (* m 3) 1)))
+ (define (count-iter cur cnt)
+ (if (= cur 1)
+ cnt
+ (count-iter (next cur) (+ cnt 1))))
+ (count-iter n 1))
+
+(define (find-max-len-start limit)
+ (define (try cur longest ans)
+ (cond ((> cur limit) ans)
+ ((= (remainder (- cur 4) 6) 0)
+ ;it's even and is 3n+1=>it's 6n+4
+ (try (+ cur 1) longest ans))
+ (else
+ (let ((len (chainlen cur))
+ (curn (+ cur 1)))
+ (if (> len longest)
+ (try curn len cur)
+ (try curn longest ans))))))
+ (let ((lowest (ceiling (/ limit 2))))
+ (try lowest 1 lowest)))
+
+(display (find-max-len-start 999999))
+(newline)