Advertisement
Guest User

2697

a guest
Feb 7th, 2012
497
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Scheme 2.42 KB | None | 0 0
  1. (define (div a b)
  2.   (if (>= (* a b) 0)
  3.       (floor (/ a b))
  4.       (+ (floor (/ a b)) 1)))
  5. (define (gcd a b)
  6.   (define (make-ret-val n-val)
  7.     (list (car n-val)
  8.           (- (caddr n-val)
  9.              (* (div b a) (cadr n-val)))
  10.           (cadr n-val)))
  11.   (if (= a 0)
  12.       (list b 0 1)
  13.       (make-ret-val (gcd (remainder b a) a))))
  14. (define (diof-solve a b c)
  15.   (define (make-ret-val n-val)
  16.     (if (= 0 (remainder c (car n-val)))
  17.         (list #t (floor (/ (* (cadr n-val) c) (car n-val)))
  18.             (floor (/ (* (caddr n-val) c) (car n-val)))
  19.             (car n-val))
  20.         (list #f 0 0 0)))
  21.   (cond ((and (= a 0) (= b 0))
  22.          (if (= c 0)
  23.              (list #t 0 0 0)
  24.              (list #f 0 0 0)))
  25.         ((= a 0)
  26.          (if (= 0 (remainder c b))
  27.              (list #t 0 (floor (/ c b)) 0)
  28.              (list #f 0 0 0)))
  29.         ((= b 0)
  30.          (if (= 0 (remainder c a))
  31.              (list #t (floor (/ c a)) 0 0)
  32.              (list #f 0 0 0)))
  33.         (else (make-ret-val (gcd a b)))))
  34. (define (solve-task rx ry a b)
  35.   (define (solve-task-subproc sol)
  36.     (define (make-kl)
  37.       (if (not (= 0 (remainder (* (cadr sol) (cadddr sol)) b)))
  38.           (+ (floor (/ (* (- (cadr sol)) (cadddr sol)) b)) 1)
  39.           (floor (/ (* (- (cadr sol)) (cadddr sol)) b))))
  40.     (define (make-kh)
  41.       (if (not (= 0 (remainder (* (caddr sol) (cadddr sol)) a)))
  42.           (+ (floor (/ (* (caddr sol) (cadddr sol)) a)) 1)
  43.           (floor (/ (* (caddr sol) (cadddr sol)) a))))
  44.     (define (solve-task-subsubproc kl kh)
  45.       (define (sub-sub-sub kkl kkh)
  46.         (cond
  47.          ((= kkl -2000000000)
  48.           (+ (cadr sol) (floor (/ (* kkh b) (cadddr sol)))
  49.              (- (caddr sol)) (floor (/ (* kkh a) (cadddr sol)))))
  50.          ((= kkh 2000000000)
  51.           (+ (cadr sol) (floor (/ (* kkl b) (cadddr sol)))
  52.              (- (caddr sol)) (floor (/ (* kkl a) (cadddr sol)))))
  53.          (else (min
  54.                 (+ (cadr sol) (floor (/ (* kkh b) (cadddr sol)))
  55.                    (- (caddr sol)) (floor (/ (* kkh a) (cadddr sol))))
  56.                 (+ (cadr sol) (floor (/ (* kkl b) (cadddr sol)))
  57.                    (- (caddr sol)) (floor (/ (* kkl a) (cadddr sol))))))))
  58.       (sub-sub-sub (max (if (> (* b (cadddr sol)) 0) kl -2000000000)
  59.                         (if (> (* a (cadddr sol)) 0) kh -2000000000))
  60.                    (min (if (< (* b (cadddr sol)) 0) kl 2000000000)
  61.                         (if (< (* a (cadddr sol)) 0) kh 2000000000))))
  62.     (cond ((not (car sol)) -1)
  63.           ((= a 0)
  64.            (max -1 (- (caddr sol))))
  65.           ((= b 0)
  66.            (max -1 (cadr sol)))
  67.           (else
  68.            (solve-task-subsubproc (make-kl) (make-kh)))))
  69.   (max -1 (solve-task-subproc (diof-solve a b (- ry rx)))))
  70. (display (solve-task (read) (read) (read) (read)))
  71. (display (newline))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement