首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Scheme中计算数字的位数和?

如何在Scheme中计算数字的位数和?
EN

Stack Overflow用户
提问于 2011-06-15 23:46:58
回答 6查看 10K关注 0票数 3

我想在Scheme中计算一个数字的位数和。它应该是这样工作的:

代码语言:javascript
复制
>(sum-of-digits 123)
 6

我的想法是将数字123转换为字符串"123",然后将其转换为列表'(1 2 3),然后使用(apply + '(1 2 3))获取6

但不幸的是,它并没有像我想象的那样工作。

代码语言:javascript
复制
>(string->list(number->string 123))
'(#\1 #\2 #\3)

显然,'(#\1 #\2 #\3)不同于'(1 2 3)……因为我在DrRacket下使用的是language racket,所以不能使用像char->digit这样的函数。

有人能帮我解决这个问题吗?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2011-06-16 00:07:16

另一种方法是使用模数对数字进行循环。我不习惯使用方案语法,但这里有一个在Lisp中适用于非负整数的函数(稍加修改就可以包含小数和负值):

代码语言:javascript
复制
(defun sum-of-digits(x) 
  (if (= x 0) 0 
      (+ (mod x 10) 
         (sum-of-digits (/ (- x (mod x 10)) 10)))))
票数 6
EN

Stack Overflow用户

发布于 2011-06-16 00:10:58

像这样的东西可以算术地做你的数字,而不是字符串样式:

代码语言:javascript
复制
(define (digits n)
    (if (zero? n)
        '()
        (cons (remainder n 10) (digits2 (quotient n 10))))

无论如何,如果这就是你正在做的,但这个问题让我想到了Project Euler。如果是这样的话,你将会在将来的问题中欣赏到这两个函数。

上面是最难的部分,下面是剩下的部分:

代码语言:javascript
复制
(foldr + (digits 12345) 0)

代码语言:javascript
复制
(apply + (digits 1234))

编辑-我去掉了上面的intLength,但如果你仍然需要它的话。

代码语言:javascript
复制
(define (intLength x)
   (define (intLengthP x c)
      (if (zero? x)
          c
          (intLengthP (quotient x 10) (+ c 1))
      )
   )
   (intLengthP x 0))
票数 2
EN

Stack Overflow用户

发布于 2011-06-16 00:09:09

这些#\1,#\2都是字符。我不想给你发短信,但是这里的球拍文档真的很棒。如果在DrRacket中突出显示string->list并点击F1,您应该会得到一个浏览器窗口,其中包含一系列有用的信息。

为了不让您蒙在鼓里,我想我可能会使用"string“函数作为您的解决方案中缺少的一步:

代码语言:javascript
复制
(map string (list #\a #\b))

..。产生

代码语言:javascript
复制
(list "a" "b")
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6360516

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档