Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Языки программирования > Lisp
Перезагрузить страницу Сложение двоичных чисел
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
Robomozg Robomozg вне форума
Новичок
 
Сообщений: 2
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 23.12.2006
По умолчанию 23.12.2006, 20:55

Помогите пожалуйста!!! Попадаю конкретно.
Дан список содержащий несколько списков с двоичными числами, например - ((1011)(111001)(101)).
Необходимо найти их сумму и вывести в двоичной форме, например - (10001101)
Количество двоичных чисел может быть сколько угодно.
Заранее очень, приочень благодарен.
Ответить с цитированием
  (#2 (permalink)) Старый
Alexey Dejneka Alexey Dejneka вне форума
Member
 
Сообщений: 451
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 23.11.2004
По умолчанию 23.12.2006, 21:29

Код:
(defun binary-add (b1 b2 &optional (carry 0))
  "Returns the sum of its arguments-binary numbers.
Numbers are represented with lists of digits (numbers 0 and 1),
least significant bit first."
  (if (and (null b1) (null b2))
      (if (= carry 0) nil '(1))
      (let* ((d1 (or (car b1) 0))
             (d2 (or (car b2) 0))
             (sum (+ d1 d2 carry)))
        (cons (if (>= sum 2) (- sum 2) sum)
              (binary-add (cdr b1) (cdr b2)
                          (if (>= sum 2) 1 0))))))

(defun b+ (numbers)
  (reverse (reduce #'binary-add (mapcar #'reverse numbers))))

CL-USER> (b+ '((1 0 1 1) (1 1 1 0 0 1) (1 0 1)))
(1 0 0 1 0 0 1)
Ответить с цитированием
  (#3 (permalink)) Старый
Robomozg Robomozg вне форума
Новичок
 
Сообщений: 2
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 23.12.2006
По умолчанию 24.12.2006, 15:54

Спасибо за пример. А есть какой-нибудь другой способ решения этой задачи? Более попроще.
Я новичек в этой среде программирования и мне бы лучше что-нибудь полегче.
Без знаков #,& и т.д. Желатеьлно чтобы участвовала рекурсия и простые операторы.
Буду очень признателен если приведете другой пример, если возможно.
Ответить с цитированием
  (#4 (permalink)) Старый
VH VH вне форума
Member
 
Сообщений: 781
Сказал(а) спасибо: 0
Поблагодарили 11 раз(а) в 10 сообщениях
Регистрация: 29.06.2006
По умолчанию 26.12.2006, 00:59

С двоичными числами ничего не получается, обратимся к десятичным:
Код:
(defun BIN_DEC (_binary); перевод в десятичный вид
  (if (cdr _binary)
   (+
    (* (MULTIPLIER _binary) (car _binary))
    (BIN_DEC (cdr _binary)))
   (car _binary)))
Код:
(defun MULTIPLIER (_list); вычисление степени 2 (для перевода в десятичный вид)
  (cond
   ((null _list) 0)
   ((null (cdr _list)) 1)
   (T (* 2 (MULTIPLIER (cdr _list))))))
Код:
(defun SUM_BINARY (_binary_list); сложение в десятичном виде (аргумент - список в двоичном виде как в задании Sandro)
 (if _binary_list
  (+ (BIN_DEC (car _binary_list)) (SUM_BINARY (cdr _binary_list)))
  0))
Остается написать функцию перевода в двоичный вид DEC_BIN и применить ее
Код:
(DEC_BIN (SUM_BINARY список_Sandro))
Ответить с цитированием
  (#5 (permalink)) Старый
VH VH вне форума
Member
 
Сообщений: 781
Сказал(а) спасибо: 0
Поблагодарили 11 раз(а) в 10 сообщениях
Регистрация: 29.06.2006
По умолчанию 26.12.2006, 15:03

А вот и функция перевода в двоичный вид (приходится использовать аккумулятор):
Код:
(defun DEC_BIN (n acc)
  (if (zerop n)
   (mapcar '(lambda (x) (rem x 2)) acc)
   (DEC_BIN (fix (/ n 2)) (cons n acc))))
Следовательно, для задачи Sandro следует применить конструкцию
Код:
(DEC_BIN (SUM_BINARY список_Sandro) nil)
Впрочем, "лишний" параметр можно "спрятать":
Код:
(defun DEC_BIN_PUBLIC (n)
  (DEC_BIN n nil))
Примечание: в функции DEC_BIN используются функции диалекта AutoLISP - (rem), возвращающая остаток от деления своего первого параметра на второй, и (fix), возвращающая целую часть своего параметра. Прошу при использовании в других диалектах применить соответствующие функции.
Ответить с цитированием
Ads.
  (#6 (permalink)) Старый
VH VH вне форума
Member
 
Сообщений: 781
Сказал(а) спасибо: 0
Поблагодарили 11 раз(а) в 10 сообщениях
Регистрация: 29.06.2006
По умолчанию 27.12.2006, 12:55

А вот переработанная функция перевода в десятичный вид (с использованием аккумулятора):
1. Вариант для диалектов, в которых (last) возвращает последний элемент списка
Код:
(defun BIN_DEC (_binary acc)
  (cond
   ((null _binary) (apply '+ acc))
   ((zerop (car _binary)) (BIN_DEC (cdr _binary) acc)); отсечение ведущих нулей в двоичном виде
   (T
    (BIN_DEC
     (butlast _binary)
     ((lambda (_last_coef _acc)
       (if (null acc)
        (cons _last_coef _acc)
        ((lambda (_coef _head_acc _tail_acc)
          (cons
           (* 2 _coef (abs _head_acc))
           (cons (if (minusp _head_acc) 0 _head_acc) _tail_acc)))
         _last_coef
         (car _acc)
         (cdr _acc))))
      (if (zerop (last _binary)) -1 1) ; здесь (LAST)
      acc)))))
2. Вариант для диалектов, в которых (last) возвращает последнюю ячейку (то есть cons) списка
Код:
(defun BIN_DEC (_binary acc)
  (cond
   ((null _binary) (apply '+ acc))
   ((zerop (car _binary)) (BIN_DEC (cdr _binary) acc)); отсечение ведущих нулей в двоичном виде
   (T
    (BIN_DEC
     (butlast _binary)
     ((lambda (_last_coef _acc)
       (if (null acc)
        (cons _last_coef _acc)
        ((lambda (_coef _head_acc _tail_acc)
          (cons
           (* 2 _coef (abs _head_acc))
           (cons (if (minusp _head_acc) 0 _head_acc) _tail_acc)))
         _last_coef
         (car _acc)
         (cdr _acc))))
      (if (zerop (car (last _binary))) -1 1) ; здесь (CAR (LAST))
      acc)))))
Вызов аналогично функции перевода в двоичный вид:
Код:
(BIN_DEC список nil)
и точно так же функцию можно "спрятать":
Код:
(defun BIN_DEC_PUBLIC (_binary)
  (BIN_DEC _binary nil))
Ответить с цитированием
  (#7 (permalink)) Старый
GyGaByyyTe GyGaByyyTe вне форума
Новичок
 
Сообщений: 7
Сказал(а) спасибо: 4
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 08.11.2011
По умолчанию 01.12.2011, 21:59

Господа знатоки LISP'a, дабы не создавать отдельной темы, решил задать вопрос здесь - не могли бы вы помочь с аналогичной программой, но реализующей ВЫЧИТАНИЕ двоичных чисел?
Ответить с цитированием
  (#8 (permalink)) Старый
Индусский код Индусский код вне форума
Member
 
Аватар для Индусский код
 
Сообщений: 108
Сказал(а) спасибо: 2
Поблагодарили 29 раз(а) в 29 сообщениях
Регистрация: 27.11.2011
Адрес: Планетка Земля)
По умолчанию 02.12.2011, 09:46

lisp Код:
(defun bin-to-ten (l)
           (let* ((rev (reverse l))
                  (res (loop for a in rev
                          for b from 0
                          summing (* a (^ 2 b)))))
             res))
(defun f (l)
           (if (null l) 0
               (- (bin-to-ten (car l)) (f (cdr l)))))
(defun f1 (n)
           (if (zerop n) ()
               (cons (mod n 2)
                     (f1 (floor n 2)))))
(defun f2 (l)
           (reverse (f1 (f l))))
(f2 '((1 1 0 1 0) (1 0 1)))
(1 0 1 0 1)
(f2 '((1 0 0 0 0) (1 1)))
(1 1 0 1)

посоны, если loop напрягает то
lisp Код:
(defun bin-to-ten (l &optional (n 0))
           (if (null l) 0
               (+ (* (car (last l))
                     (expt 2 n))
                  (bin-to-ten (butlast l) (1+ n)))))

Последний раз редактировалось Индусский код; 02.12.2011 в 10:35
Ответить с цитированием
Пользователь сказал cпасибо:
GyGaByyyTe (04.12.2011)
  (#9 (permalink)) Старый
GyGaByyyTe GyGaByyyTe вне форума
Новичок
 
Сообщений: 7
Сказал(а) спасибо: 4
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 08.11.2011
По умолчанию 04.12.2011, 17:29

Цитата:
Сообщение от Индусский код Посмотреть сообщение
lisp Код:
(defun bin-to-ten (l)
Спасибо, уважаемый!) тоесть в принципе здесь вычитается после преобразования двоичного в десятичное чисел, и потом обратно результата? возможность получения отрицательного результата здесь учтена?
Ответить с цитированием
  (#10 (permalink)) Старый
Индусский код Индусский код вне форума
Member
 
Аватар для Индусский код
 
Сообщений: 108
Сказал(а) спасибо: 2
Поблагодарили 29 раз(а) в 29 сообщениях
Регистрация: 27.11.2011
Адрес: Планетка Земля)
По умолчанию 04.12.2011, 17:37

Цитата:
Сообщение от GyGaByyyTe Посмотреть сообщение
возможность получения отрицательного результата здесь учтена?
нет)
и тут
lisp Код:
summing (* a (^ 2 b)))))
нужно ^ на expt исправить)

Последний раз редактировалось Индусский код; 04.12.2011 в 17:41
Ответить с цитированием
Пользователь сказал cпасибо:
GyGaByyyTe (04.12.2011)
  (#11 (permalink)) Старый
GyGaByyyTe GyGaByyyTe вне форума
Новичок
 
Сообщений: 7
Сказал(а) спасибо: 4
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 08.11.2011
По умолчанию 04.12.2011, 18:12

Цитата:
Сообщение от Индусский код Посмотреть сообщение
нет)
и тут
lisp Код:
summing (* a (^ 2 b)))))
нужно ^ на expt исправить)
надеюсь препода и без учета отрицательных устроит) а bin-to-ten я взял второй вариант) без лупа) на всякий случай) рекурсия как то привычней) спасибо большое!
Ответить с цитированием
  (#12 (permalink)) Старый
GyGaByyyTe GyGaByyyTe вне форума
Новичок
 
Сообщений: 7
Сказал(а) спасибо: 4
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 08.11.2011
По умолчанию 11.12.2011, 20:17

Мммм, такое дело... программа нужна такая, чтобы вычитала именно в двоичном коде, без переводов в 10ую систему. Можете помочь?
Ответить с цитированием
Ads
  (#13 (permalink)) Старый
_sg _sg вне форума
Member
 
Аватар для _sg
 
Сообщений: 525
Сказал(а) спасибо: 5
Поблагодарили 42 раз(а) в 38 сообщениях
Регистрация: 23.01.2007
По умолчанию 12.12.2011, 00:40

вариант с переводом в десятичную:
lisp Код:
(defun bb (w)
  (format nil "~b" (reduce (car w) (mapcar #'(lambda (a) (parse-integer (write-to-string a) :radix 2)) (cdr w)))))

> (bb  '(+ 1011 111001 101))
"1001001"
Ответить с цитированием
  (#14 (permalink)) Старый
GyGaByyyTe GyGaByyyTe вне форума
Новичок
 
Сообщений: 7
Сказал(а) спасибо: 4
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 08.11.2011
По умолчанию 12.12.2011, 12:16

Ребята, помогите пожалуйста с вычитанием в двоичной системе...
Ответить с цитированием
  (#15 (permalink)) Старый
VH VH вне форума
Member
 
Сообщений: 781
Сказал(а) спасибо: 0
Поблагодарили 11 раз(а) в 10 сообщениях
Регистрация: 29.06.2006
По умолчанию 14.12.2011, 15:21

lisp Код:
(defun F (B1 B2)
 (cdr
  (reverse
   ((lambda (fdef)
     (funcall fdef fdef (reverse B1) (reverse B2) 1))
    (function
     (lambda (fname rB1 rB2 flag)
      (if (or rB1 rB2)
       ((lambda (sum)
         (cons
          (rem sum 2)
          (funcall fname fname (cdr rB1) (cdr rB2) (truncate sum 2))))
        (+
         (if rB1 (car rB1) 0)
         (if rB2 (abs (1- (car rB2))) 1)
         flag))
       (cons flag nil))))))))
Ответить с цитированием
Пользователь сказал cпасибо:
GyGaByyyTe (14.12.2011)
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Раскодирование двоичных данных MDB. Maikroft Задания за деньги 2 09.08.2011 14:32
Как сложить два массива двоичных чисел Dj_John Вопросы начинающих программистов 3 01.06.2010 20:30
Сложение двух последних чисел списка klif_leopard Lisp 2 13.04.2009 00:02
Сложение чисел на двоичном сумматоре Wizzard Pascal 7 18.01.2008 15:34
Сложение двух 50-значных чисел через randomize() altro_via Вопросы начинающих программистов 17 26.12.2007 23:30
Сложение целых десятичных чисел в С и Turbo C++ altro_via Вопросы начинающих программистов 20 26.12.2007 13:38
умножения двух 16-байтных двоичных чисел в дополнительном deeeman Pascal 4 12.12.2007 04:42
Сложение 64 битных чисел,умножение, деление Dima2006 C++ Builder 3 22.09.2006 10:03
Сокеты, передача двоичных данных HTTP_OK C++ Builder 3 13.05.2006 03:57
Сложениевычитание двоичных кодов на java/c++ outcast11 Java 3 08.04.2006 14:29
Как напечатать массив двоичных цифр М+1 ALeK$a Вопросы начинающих программистов 6 10.01.2005 00:02
Как прописать код сложение двух комплексных чисел griban Вопросы начинающих программистов 1 06.05.2004 02:36



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов