Ladies_Man

Длинная арифметика

Dec 26th, 2013
150
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Scheme 3.42 KB | None | 0 0
  1. (define (l->s l)
  2.   l)
  3. (define (s->l s)
  4.   s)
  5.  
  6. (define (string->cifra S k)
  7.   (- (char->integer (string-ref S (- (string-length S) k))) (char->integer #\0)))
  8.  
  9. (define (s->0 s1 s2)
  10.    (define (iter S)
  11.      (if (>= (string-length S) (string-length s2)) S (iter (string-append "0" S))))
  12.   (iter s1))
  13.  
  14. (define (l++ s1 s2)
  15.    (let ((s1 (s->0 s1 s2))
  16.         (s2 (s->0 s2 s1)))
  17.    (define (iter S i o)
  18.      (if (> i (string-length s1))
  19.          (if (= o 1) (string-append "1" S) S)
  20.          (let ((k1 (string->cifra s1 i))
  21.                (k2 (string->cifra s2 i)))
  22.               (iter (string-append (number->string (remainder (+ k1 k2 o) 10)) S)
  23.                     (+ i 1) (quotient (+ k1 k2 o) 10)))))
  24.   (iter "" 1 0)))
  25.  
  26. (define (delete0 S)
  27.   (if (equal? S "0") "0"
  28.       (if (equal? (string-ref S 0) #\0) (delete0 (substring S 1)) S)))
  29.  
  30. (define (inverse S)
  31.   (if (> (string-length S) 0)
  32.     (string-append (number->string (- 9 (string->cifra S (string-length S)))) (inverse (substring S 1)))
  33.     ""))
  34.  
  35. (define (l-- s1 s2)
  36.    (define (iter S i o s1 s2)
  37.      (if (> i (string-length s1))
  38.          (if (= o 1)
  39.             (string-append "9" S)
  40.             S)
  41.          (let ((k1 (string->cifra s1 i))
  42.                (k2 (string->cifra s2 i)))
  43.               (iter (string-append (number->string (remainder (- (+ k1 10) k2 o) 10)) S) (+ i 1) (- 1 (quotient (- (+ k1 10) k2 o) 10)) s1 s2) )))
  44.   (let ((k(iter "" 1 0 (s->0 s1 s2) (s->0 s2 s1))))
  45.        (if (> (string-length k) (string-length s1))
  46.            (string-append "-" (l++ (delete0 (inverse k)) "1"))
  47.            (delete0 k)))  )
  48.  
  49. (define (my-even? S)
  50.   (even? (string->cifra S 1)))
  51.  
  52. (define (delenie2 x)
  53.   (number->string (/ (string->number x) 2)))
  54.  
  55. (define (l** x y)
  56.   (if (or (equal? y "0") (equal? x "0"))
  57.       "0"
  58.       (if (equal? y "1")
  59.           x
  60.           (if (my-even? y)
  61.              (l** (l++ x x) (delenie2 y))
  62.              (l++ x (l** x (l-- y "1")))))))
  63.  
  64. (define (>? x y)
  65.   (not (or  (equal? (string-ref (l-- x y) 0) #\-) (equal? (l-- x y)  "0"))))
  66.  
  67. (define (=? x y)
  68.  (equal? (l-- x y)  "0"))
  69.  
  70. (define (l// x y)
  71.    (define (del x y S)
  72.      (if (or (=? x y) (>? x y))
  73.          (del (l-- x y) y (+ S 1))
  74.          (list (number->string S) x)))
  75.    (define (iter x S o)
  76.      (if (equal? x "")
  77.          S
  78.          (let ((d (del (string-append o (substring x 0 1)) y 0)))
  79.            (iter (substring x 1) (string-append S (car d)) (cadr d)))))
  80.    (if (or (>? x y) (equal? x y) (equal? x "0"))
  81.        (delete0 (iter x "" "0"))
  82.        "0"))  
  83.  
  84. (define (l+ . args)
  85.   (define (iter l S)
  86.     (if (zero? (length l)) S (iter (cdr l) (l++ (car l) S))))
  87.   (iter args "0"))
  88.  
  89. (define (l- . args)
  90.   (define (iter l S)
  91.     (if (zero? (length l)) S (iter (cdr l) (l-- S (car l)))))
  92.   (iter (cdr args) (car args)))
  93.  
  94. (define (l* . args)
  95.   (define (iter l S)
  96.     (if (zero? (length l)) S (iter (cdr l) (l** (car l) S))))
  97.   (iter args "1"))
  98.  
  99. (define (l-quotient . args)
  100.   (define (iter l S)
  101.     (if (zero? (length l)) S (iter (cdr l) (l//  S (car l)))))
  102.   (iter (cdr args) (car args)))
  103.  
  104. (define (l-remainder lx ly)
  105.   (l-- lx (l** (l// lx ly) ly)))
  106.  
  107. (define (l-factorial x)
  108.   (define (iter i S)
  109.     (if (>? i x) S (iter (l++ i "1") (l** S i))))
  110.   (iter "1" "1"))
  111.  
  112. (define (l= . args)
  113.   (define (iter l )
  114.     (if (zero? (length l))
  115.         #t
  116.         (if (equal? (car l) (car args))
  117.           (iter (cdr l))
  118.           #f)))
  119.   (iter (cdr args)))
Advertisement
Add Comment
Please, Sign In to add comment