数字出现的次数

时间:2012-09-06 18:27:54

标签: scheme racket

好的,上个学期我参加了计划,我知道你在一个学期内不能擅长计划。一位朋友问我如何计算某个数字出现在某个数字中的次数。我知道如果它是一个列表怎么办。起初我认为这是一个简单的使用内置商或其余,但没有结束它对我来说。例如,我如何计算五个出现在一个数字中的次数:(numfives 125458563)应该返回3.任何帮助表示赞赏。

P:我没有用他的帮助他,我正在为自己做这件事。我喜欢挑战。

4 个答案:

答案 0 :(得分:3)

使用string->list将字符串转换为字符列表。然后按照您的列表进行操作,您说您已经知道该怎么做。 (您可以使用各种格式化函数将数字转换为字符串。)

答案 1 :(得分:2)

我不喜欢所有基于字符串的解决方案。

在我看来,最好的方法是在每个阶段通过将(和修改)除以10来查看每个数字,然后进行比较。例如:

(define (count-digit num digit)
  (let loop ((num num)
             (count 0))
    (if (zero? num) count
        (loop (quotient num 10)
              (+ count (if (= digit (remainder num 10)) 1 0))))))

答案 2 :(得分:1)

这是一种可能的方法:将number参数转换为字符列表,并计算字符数等于与作为参数接收的digit对应的字符:

(define (num-digits number digit)
  (let ((n (number->string number))
        (d (integer->char (+ (char->integer #\0) digit))))
    (count (lambda (x) (char=? x d))
           (string->list n))))

编写上述程序的另一种方法,更短但更难阅读:

(define (num-digits number digit)
  (count (curry char=? (integer->char (+ (char->integer #\0) digit)))
         (string->list (number->string number))))

另一个替代方案是通过算术运算依次处理每个数字,如@ ChrisJester-Young的答案,但考虑到数字和数字都正好为零的边缘情况,并避免重新定义内置的count程序 - 还要记住,这只适用于整数> = 0和基数10.这是如何:

(define (num-digits number digit)
  (if (= number digit 0)
      1
      (let loop ((num number)
                 (counter 0))
        (cond ((zero? num)
               counter)
              ((= digit (remainder num 10))
               (loop (quotient num 10) (add1 counter)))
              (else
               (loop (quotient num 10) counter))))))

上面基于字符串的解决方案可能看起来有点笨拙,但编写时间更短,并且具有使用负数,带小数的数字,基数不等于10的数字等的额外优势。无论如何,这将适用于任何版本:

(num-digits 125458563 5)
> 3

这适用于基于字符串的版本:

(num-digits -123.1234152 1)
> 3

答案 3 :(得分:0)

将数字转换为列表,然后找出数字出现在数字中的次数。 用于将数字转换为列表See this example.