Advertisement
Guest User

STYLE.

a guest
Oct 9th, 2015
114
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Racket 5.26 KB | None | 0 0
  1. ;; a bignum is characterized by a list of 0-9 integers in
  2. ;;     reverse order of their base-10 representation,
  3. ;;     followed by a zero
  4. ;; - nums : list
  5. (define-struct bignum (nums))
  6.  
  7. ;; number2bignum : number -> bignum
  8. ;; Inputs : an integer, num
  9. ;; Output : a list with the digits of num in reverse order,
  10. ;;          followed by a zero
  11. (define (number2bignum num)
  12.   (cond
  13.     [(= num 0) (make-bignum (list 0))]
  14.     [(not (= num 0)) (make-bignum (cons (remainder num 10)
  15.                            (bignum-nums (number2bignum (floor (/ num 10))))))]))
  16.  
  17. (check-expect (number2bignum 0) (make-bignum (list 0)))
  18. (check-expect (number2bignum 1) (make-bignum (list 1 0)))
  19. (check-expect (number2bignum 126) (make-bignum (list 6 2 1 0)))
  20. (check-expect (number2bignum 6581) (make-bignum (list 1 8 5 6 0)))
  21. (check-expect (number2bignum 9876) (make-bignum (list 6 7 8 9 0)))
  22.  
  23. ;; bignum2number : bignum -> number
  24. ;; Inputs : a bignum, bnum
  25. ;; Output : the number with the digits of bignum in reverse order
  26. (define (bignum2number bnum)
  27.   (cond
  28.     [(empty? (bignum-nums bnum)) 0]
  29.     [(cons? (bignum-nums bnum))
  30.      (+ (first (bignum-nums bnum))
  31.         (* 10 (bignum2number (make-bignum (rest (bignum-nums bnum))))))]))
  32.  
  33. (check-expect (bignum2number (make-bignum (list 0))) 0)
  34. (check-expect (bignum2number (make-bignum (list 1 0))) 1)
  35. (check-expect (bignum2number (make-bignum (list 6 2 1 0))) 126)
  36. (check-expect (bignum2number (make-bignum (list 1 8 5 6 0))) 6581)
  37. (check-expect (bignum2number (make-bignum (list 6 7 8 9 0))) 9876)
  38.  
  39. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  40. ;;;;;;;;;;;;Bignum+;;;;;;;;;;;
  41. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  42.  
  43. ;; a helper procedure for bignum+, requires the extra parameter carry
  44. ;; plus-helper : bignum, bignum, number -> bignum
  45. ;; Inputs : two bignums, bnum1 and bnum2, and a number, carry
  46. ;; Output : the sum of bnum1 and bnum2
  47. (define (plus-helper bnum1 bnum2 carry)
  48.   (cond
  49.     [(empty? (bignum-nums bnum1)) bnum2]
  50.     [(empty? (bignum-nums bnum2)) bnum1]
  51.     [else (make-bignum (cons
  52.                          (bnrem
  53.                            (bnadd carry
  54.                                   (bnadd (first (bignum-nums bnum1))
  55.                                          (first (bignum-nums bnum2))))
  56.                            10)
  57.                          (bignum-nums
  58.                            (plus-helper
  59.                              (make-bignum (rest (bignum-nums bnum1)))
  60.                              (make-bignum (rest (bignum-nums bnum2)))
  61.                              (bnquo
  62.                                (bnadd carry
  63.                                       (bnadd (first (bignum-nums bnum1))
  64.                                              (first (bignum-nums bnum2))))
  65.                                10)))))]))
  66.  
  67. ;;
  68. ;; bignum+ : bignum, bignum -> bignum
  69. ;; Inputs : two bignums, bnum1 and bnum2
  70. ;; Output : the sum of bnum1 and bnum2
  71. (define (bignum+ bnum1 bnum2)
  72.   (number2bignum (bignum2number (plus-helper bnum1 bnum2 0))))
  73.  
  74. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  75. ;;;;;;;;;;;;Bignum*;;;;;;;;;;;
  76. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  77.  
  78. (define (singlemult s mul carry)
  79.   (cond
  80.     [(empty? (bignum-nums mul)) empty]
  81.     [(cons? (bignum-nums mul)) (cons (bnadd carry (bnrem (bnmult s (first (bignum-nums mul))) 10 ))
  82.         (singlemult s (make-bignum (rest (bignum-nums mul))) (bnquo (bnmult s (first (bignum-nums mul))) 10 )))]))
  83.  
  84. (define (bignum* a b)
  85.   (cond
  86.     [(empty? (bignum-nums b)) (make-bignum (list 0))]
  87.     [(cons? (bignum-nums b)) (bignum+ (number2bignum (bignum2number (make-bignum (singlemult (first (bignum-nums b)) a 0))))
  88.                                                    
  89.                              (make-bignum (cons 0 (bignum-nums (bignum* (make-bignum (rest (bignum-nums b)))
  90.                                                               (make-bignum (bignum-nums a)))))))]))
  91.  
  92. (check-expect (bignum2number (bignum* (make-bignum (list 5 2 0 ))
  93.                                       (make-bignum (list 5 2 0 )))) 625)
  94. (check-expect (bignum2number (bignum* (make-bignum (list 0 3 0 ))
  95.                                       (make-bignum (list 0 2 0 )))) 600)
  96.  
  97. (check-expect (bignum* (make-bignum (list 0))
  98.                        (make-bignum (list 0)))
  99.               (make-bignum (list 0)))
  100.  
  101. (check-expect (bignum* (make-bignum (list 1 0)) (make-bignum (list 9 0)))
  102.               (make-bignum (list 9 0)))
  103.  
  104. (check-expect (bignum* (make-bignum (list 1 0)) (make-bignum (list 9 0)))
  105.               (make-bignum (list 9 0)))
  106.  
  107. (check-expect (bignum* (make-bignum (list 1 2 0)) (make-bignum (list 9 0)))
  108.               (make-bignum (list 9 8 1 0)))
  109.  
  110. (check-expect (bignum* (make-bignum (list 5 5 5 5 0))
  111.                        (make-bignum (list 1 2 3 0)))
  112.               (make-bignum (list 5 5 1 3 8 7 1 0)))
  113.  
  114. (check-expect (bignum* (make-bignum (list 5 6 0))
  115.                        (make-bignum (list 5 6 7 8 9 0)))
  116.               (make-bignum (list 5 2 7 9 1 4 6 0)))
  117.  
  118. (check-expect (bignum* (make-bignum (list 1 1 1 1 0))
  119.                        (make-bignum (list 1 1 1 1 0)))
  120.               (make-bignum (list 1 2 3 4 3 2 1 0)))
  121.  
  122. (check-expect (bignum* (make-bignum (list 1 2 3 4 5 6 7 8 9 0))
  123.                        (make-bignum (list 1 2 3 4 5 6 7 8 9 0)))
  124.               (make-bignum (list 1 4 0 1 7 9 9 8 7 7 5 0 1 6 4 5 7 9 0)))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement