Выведите целое число и его цифры поменялись


Эта общая программа на Лиспе-это упражнение, чтобы напечатать целое число и его цифры поменялись на экран:

(defun read-number () (format t "Enter a number: ~%") (read))

(defun reverse-string (the-string) 
  (if (eq (length the-string) 0) 
    "" 
    (concatenate 'string (reverse-string (subseq the-string 1)) (subseq the-string 0 1))))

(defun reverse-digits (the-number) (reverse-string (write-to-string the-number)))

(let ((the-number (read-number)))
  (format t "N->: ~a~%<-N: ~a~%" the-number (reverse-digits the-number)))


2881
4
задан 10 марта 2011 в 02:03 Источник Поделиться
Комментарии
2 ответа

Эта проблема является больше о количестве, чем строк, поэтому я почувствовал необходимость добавить не-строку решения. У меня есть оригинальная схема версию, и общий Лисп адаптация же.

Схемы версия:

(define (reverse-digits n)
(let loop ((n n) (r 0))
(if (zero? n) r
(loop (quotient n 10) (+ (* r 10) (remainder n 10))))))

Общий перевод сюсюкать схемы версия:

(defun reverse-digits (n)
(labels ((next (n v)
(if (zerop n) v
(multiple-value-bind (q r)
(truncate n 10)
(next q (+ (* v 10) r))))))
(next n 0)))

3
ответ дан 10 марта 2011 в 03:03 Источник Поделиться

Ты про цифры и число, но для меня, как не-lisper, это выглядит так, как будто вы работаете со строками.


  • Я бы взял число, по модулю 10, распечатать эту цифру.

  • Если остальное > 0 рекурсивно вызвать функцию с (количество цифр) / 10.

В большинстве языков с целыми числами-арифметические можно опустить вычитания, поскольку 37/10 => 3 :==: (37-7)/10 => 3

В Scala это будет выглядеть так:

def redigit (n: Int, sofar: Int = 0) : Int = { 
if (n == 0) sofar else
redigit (n / 10, sofar * 10 + n % 10)}

redigit (123)
321

Он использует аргументы по умолчанию. Первые тесты с drscheme выступает не удастся. Вот что я придумал:

;; redigit : number number -> number
(define (redigit in sofar)
(cond [(< in 1) sofar]
[else (redigit (/ in 10) (+ (* 10 sofar) (modulo in 10)))])
)

(redigit 134 0)

Но отдел является точным и не отрезать цифры за точкой floting. Я получаю эту ошибку:


по модулю: ожидается тип как 1
аргумент, приведенный: 67/5; другие аргументы
были: 10

Я посмотрел на toInt функции, asInt, пол, круглые и так далее на срок (/ в 10), но я не нашел что-то полезное. Может быть, вы знаете это сами?

1
ответ дан 10 марта 2011 в 02:03 Источник Поделиться