好的,上个学期我参加了计划,我知道你在一个学期内不能擅长计划。一位朋友问我如何计算某个数字出现在某个数字中的次数。我知道如果它是一个列表怎么办。起初我认为这是一个简单的使用内置商或其余,但没有结束它对我来说。例如,我如何计算五个出现在一个数字中的次数:(numfives 125458563)应该返回3.任何帮助表示赞赏。
P:我没有用他的帮助他,我正在为自己做这件事。我喜欢挑战。答案 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.