2013-03-09 2 views
2

나는이 운동을하고있다. Pascal's Trapezoid어떻게 Clojure에서 정수 오버플로를 해결할 수 있습니까?

내 솔루션은 다음과 같습니다

(fn pascal[initseq] 
    (let [gen-nextseq (fn [s] 
         (let [s1 (conj (vec s) 0) 
          s2 (cons 0 s)] 
         (map + s1 s2)))] 
    (cons 
     initseq 
     (lazy-seq 
     (pascal 
      (gen-nextseq initseq)))))) 

나는 처음 세 개의 테스트 케이스를 통과하지만, 마지막에 실패했습니다.

그래서, Clojure의 큰 정수가, 또는 문제를 해결하기 위해 더 나은 방법이있다 : "정수 오버 플로우 java.lang.ArithmeticException"

그것은 말한다?

답변

8

+를 +로 변경하십시오. 자동으로 결과물을 얻을 수 있습니다 .Lang.BigInt 결과가 길면 적합하지 않습니다. 리터럴의 N 접미어를 사용하여 BigInt를 얻을 수도 있습니다.

(class (+' 3 2)) ;=> java.lang.Long 
(class (+' 300000000000000000000000000000 2)) ;=> clojure.lang.BigInt 
(class 3N) ;=> clojure.lang.BigInt 
2

당신은 임의의 정밀도 +' 대신 +를 사용할 수 있습니다.

(fn pascal[initseq] 
    (let [gen-nextseq (fn [s] 
         (let [s1 (conj (vec s) 0) 
          s2 (cons 0 s)] 
         (map + s1 s2)))] 
          ^^ 
... 

따라서 위의 표시된 코드는 다음과 같이 수정할 수 있습니다.

     (map +' s1 s2)))] 
관련 문제