反转整数

r-s*_*r-s 3 scheme racket

我正在尝试编写一个函数,它接受一个输入数字并以相反的顺序输出数字.

即:

输入 - > 25输出 - > 52

输入 - > 125输出 - > 521

我是lisp的新手,如果它有用的话是c ++中的工作函数

function.cpp

int revs(int rev, int n)
{
  if (n <= 0)
    return rev;

  return revs((rev * 10) + (n % 10), n/10);
}
Run Code Online (Sandbox Code Playgroud)

我在Racket中写了如下:

(define (revs rev n)
  (if (<= n 0)
     rev
     (revs (+ (* rev 10) (modulo n 10)) (/ n 10))))
Run Code Online (Sandbox Code Playgroud)

但当我运行它(转速0 125)时,我收到此错误:

modulo: contract violation
  expected: integer?
  given: 25/2
  argument position: 1st
  other arguments...:
   10
Run Code Online (Sandbox Code Playgroud)

当然我在这里做错了,但我不确定我错过了什么.

Jos*_*lor 5

除法运算符/不进行整数除法,而是一般除法,所以当你打电话时,例如(/ 25 2),你没有得到12或者13,而是理性25/2.我认为你想要的quotient是文档所包含的内容:

procedure (quotient n m) ? integer?  
  n : integer?   
  m : integer?
Run Code Online (Sandbox Code Playgroud)

退货(truncate (/ n m)).例子:

> (quotient 10 3)
3
> (quotient -10.0 3)
-3.0
> (quotient +inf.0 3)
quotient: contract violation  
  expected: integer?   
  given: +inf.0  
  argument position: 1st
  other arguments...:
   3
Run Code Online (Sandbox Code Playgroud)


ben*_*ers 5

按字典顺序处理操作:

#lang racket
(define (lexicographic-reverse  x)
  (string->number
   (list->string
    (reverse
     (string->list
      (number->string x))))))
Run Code Online (Sandbox Code Playgroud)

适用于任何 Racket 的数字类型[1]。


[编辑 1] 我意识到“作品”是依赖于上下文的,并且通过一些测试显示了操作的隐含假设。我天真的字典方法使负整数变得一团糟,例如(lexicographic-reverse -47)会产生错误。

但是,-74如果我出于字典顺序而不是数字原因反转数字,则获得错误而不是可能会更好,因为它说明了“反转数字”的定义是任意的事实。47 的反转也可能是 -74 和 74,因为反转不是一个数学概念——尽管它可能让我想起 XOR 排列。

特定的反转功能如何处理符号是任意的。

#lang racket

;; Reversing a number retains the sign
(define (arbitrary1  x) 
  (define (f n)
    (string->number
     (list->string
      (reverse
       (string->list
        (number->string n))))))
  (if (>= x 0)
      (f x)
      (- (f (abs x)))))

;; Reversing a number reverses the sign
(define (arbitrary2  x)
  (define (f n)
    (string->number
     (list->string
      (reverse
       (string->list
        (number->string n))))))
  (if (>= x 0)
      (- (f x))
      (f (abs x))))
Run Code Online (Sandbox Code Playgroud)

相同的考虑扩展到 Racket 的其他数字类型符号;关于倒车准确,不精确的,复杂的决策,同样是任意的-例如,什么是IEEE的反向+inf.0+nan.0

  • 哦,我需要窃取这个作为所谓线程宏的示例。:) `(~&gt; x number-&gt;string string-&gt;list reverse list-&gt;string string-&gt;number)`。 (2认同)