【发布时间】:2016-10-28 08:42:24
【问题描述】:
下面是我遇到的问题,在此之后我解释了我目前所处的位置以及我创建的代码, 在 Scheme 中编写如下函数:
1.a "digitinc4" - 将一个 4 位整数作为输入,并返回由原始输入整数的数字构成的另一个 4 位整数,每个数字都递增。例如,(digitinc4 4833) 将返回 5944。当数字为 9 时,对应的输出数字应为 0。例如: (digitinc4 4892) 将返回 5903。您可以假设输入数字至少为 1000 - 也就是说,没有前导零。
b.扩展您在上述问题 (a) 中的答案,以处理具有任意位数的输入整数。此函数应命名为“digitinc”(名称中不带“4”)。例如: (digitinc 83) 将返回 94,而 (digitinc 22897) 将返回 33908。
到目前为止,我知道我可以通过添加来增加每个数字
+1
+10
+100
+1000
等
作为一个例子
以下结果是与我要测试的数字相对应的余数:
assuming input is 4816
1st digit 4816 % 10 = 6 (does not equal 0, increment next digit)
2nd digit 4816 / 10 = 481.6
481.6 % 10 = 1 (does not equal 0, increment next digit)
3rd digit
481.6 / 10 = 48.16
48.16 % 10 = 8 (does not equal 0, increment next digit)
4th digit
48.16 / 10 = 4.816
4.816 % 10 = 4 (does not equal 0, increment next digit)
我可以使用这些余数来确定某物是否为 0 增加那个数字后,我可以跳过下一个数字增加
有一些特殊情况,如果一个数字是9加1就会变成0。(因为9+1 = 10) 所以我可以检查这个数字是否为零(在加法之后)以知道跳过下一个数字加法使用 mod: 4816+1 >>>> 4817 % 10 不等于零。所以我知道数字不是零,所以我可以继续添加+10 这是使用 mod 的情况: 4819+1 >>>> 4820 % 10 = 0 所以我知道我现在可以跳过 +10 并添加 +100(因为我不想增加一个数字两次
基于此,我生成了一些运行但没有达到理想结果的代码。 一切都按预期进行,直到第一个条件结束。 在第二个条件下,在第一次测试中,调试器说 2408/5 正在发生。 我在这里完全迷失了,我已经调试了很多次,但是 drracket 不够复杂,无法给我更多细节。 请如果有人可以就这种情况分享一些见解或建议,或者我可以如何以更简单更有效的方式实现我所拥有的。
下面是我的方案代码:
(define (mod x)
(modulo x 10))
(define (di4 n)
(+ n 1) ; increment 1st digit
(cond ;check if 1st digit became 0 if so skip and increment 100 otherwise continue normal
[(= (mod n) 0) (+ n 100)] ;increment 3rd if 2nd is 0
[else (+ n 10)]) ;increment 2nd digit
(cond
[(= (mod (/ n 10)) (+ n 1000))] ;increment 4th if 3rd is 0
[else (+ n 100)]) ;increment 3rd
(cond
[(= (mod (/ n 100) (+ n 10000)))] ;increment 5th if 4th is 0
[else (+ n 1000)]) ;increment 4th
)
【问题讨论】:
-
现在你如何处理数字 1 或者 2,如果第一个溢出,则执行第二个操作。最好不要溢出,以便您可以分别处理每个数字。打破数字,增加而不溢出,加入结果。您可以通过转换为数字并返回,或者您可以使用 10 的幂来计算商/余数。我会使用 SRFI-1
unfold-right、map和fold。quotient将进行整数除法。