Ladies_Man

Перевод из одной системы счисления в другую

Dec 26th, 2013
150
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Scheme 2.08 KB | None | 0 0
  1. (define (correct-number? s b)
  2.   (define (iter xs b)
  3.     (if (null? xs) (null? xs) (f (cond
  4.                                 ((<= (char->integer (car xs)) (char->integer #\9))
  5.                                      (- (char->integer (car xs)) (char->integer #\0)))
  6.                                 ((<= (char->integer (car xs)) (char->integer #\Z))
  7.                                      (+ (- (char->integer (car xs)) (char->integer #\A)) 10))
  8.                                 ((<= (char->integer (car xs)) (char->integer #\z))
  9.                                      (+ (- (char->integer (car xs)) (char->integer #\a)) 10)))
  10.   (cdr xs) b)))
  11.   (define (f x xs b)
  12.     (if (< x b) (iter xs b) (< x b)))
  13. (iter (string->list s) b))
  14.  
  15.  
  16.  
  17. (define (certain->decimal s b)
  18.   (define (f1 n b k)
  19.     (if (= n 1)
  20.         k
  21.         (f1 (- n 1) b (* k b))))
  22.   (define (iter xs b k it)
  23.     (if (null? xs)
  24.         it
  25.         (f (cond
  26.              ((<= (char->integer (car xs)) (char->integer #\9)) (- (char->integer (car xs)) (char->integer #\0)))
  27.              ((<= (char->integer (car xs)) (char->integer #\Z)) (+ (- (char->integer (car xs)) (char->integer #\A)) 10))
  28.              ((<= (char->integer (car xs)) (char->integer #\z)) (+ (- (char->integer (car xs)) (char->integer #\a)) 10)))
  29.            (cdr xs) b k it)))
  30.   (define (f x xs b k it)
  31.     (if (< x b)
  32.         (iter xs b (quotient k b) (+ it (* x k)))
  33.         'number-conversion-error))
  34.   (iter (string->list s) b (f1 (string-length s) b 1) 0))
  35.  
  36.  
  37.  
  38. (define (decimal->certain d b)
  39.   (define (f d b k)
  40.     (if (< d b)
  41.         k
  42.         (f (quotient d b) b (* k b))))
  43.   (define (iter xs d b k)
  44.     (if (zero? k)
  45.         (if (null? xs)
  46.             "0"
  47.             (list->string xs))
  48.         (iter (append xs (list (cond
  49.                                 ((<= (quotient d k) 9) (integer->char (+ (quotient d k) (char->integer #\0))))
  50.                                 ((<= (quotient d k) 35) (integer->char (+ (- (quotient d k) 10) (char->integer #\a)))))))
  51.            (remainder d k) b (quotient k b))))
  52.   (if (< b 37)
  53.       (iter '() d b (f d b 1))))
Advertisement
Add Comment
Please, Sign In to add comment