【发布时间】:2015-08-03 17:54:34
【问题描述】:
我正在处理 Codewars Ruby 问题,但不明白我看到的错误。以下是说明:
用阶乘编码十进制数是一种写出数字的方法 在一个依赖阶乘而不是幂的基础系统中 数字。在此系统中,最后一位数字始终为 0,并且以 0 为基数! 之前的数字是 0 或 1,并且以 1 为基数!数字 在此之前是 0、1 或 2,并且以 2 为底!更普遍, 总是 0、1、2、... 或 n 中的倒数第 n 个数字,并且以 n! 为基数。
示例:十进制数 463 编码为“341010”
因为 463(以 10 为底)= 3×5! + 4×4! + 1×3! + 0×2! + 1×1! + 0×0!
如果我们仅限于数字 0...9,我们可以编码的最大数字是 10! - 1.
所以我们用字母 A 到 Z 扩展 0..9。有了这 36 个数字,我们可以 代码高达36! − 1 = 37199332678990121746799944815083519999999910 (以 10 为基数)
我们编写两个函数,第一个将编写一个十进制数,然后 返回具有阶乘表示的字符串: "dec2FactString(nb)"
第二个将解码具有阶乘表示的字符串 并产生十进制表示:“factString2Dec(str)”。
给定的数字将是正数。
注意
您可以希望在 Clojure、Python、Ruby、Haskel 中使用大整数进行测试 但不适用于 Java 和其他数字“nb”在 "dec2FactString(nb)" 最多长。
def dec2FactString(nb)
if nb <= 0 then
num = 1
else
num = (nb * dec2FactString(nb - 1))
end
return num
end
请注意,这种方法只是问题的前半部分。此代码似乎可以工作,因为它返回正确的阶乘,在使用此测试时作为 Fixnum:
Test.assert_equals(dec2FactString(4), "24")
由于说明要求输入字符串,我通常认为只需将“.to_s”添加到 num 变量就可以解决这个问题,但我看到的是一致的“字符串不能被强制转换为 Fixnum (TypeError)”错误信息。我尝试将输出推送到数组并从那里打印,但看到了同样的错误。
我对 Fixnum 进行了一些阅读,并且我理解在将 Fixnum 添加到字符串方面的错误不起作用,但我认为在这种情况下我不会这样做 - 我只是想转换Fixnum 输出成一个字符串。我错过了什么吗?
观察 - 此代码中断并在其下方产生错误:
def dec2FactString(nb)
if nb <= 0 then
num = 1
else
num = (nb * dec2FactString(nb - 1))
end
return num.to_s
end
Example from description
`*': String can't be coerced into Fixnum (TypeError)
from `dec2FactString'
from `dec2FactString'
from `dec2FactString'
from `dec2FactString'
from `block in
'
from `block in describe'
from `measure'
from `describe'
from `
'
【问题讨论】: