gpt4 book ai didi

java - 使用大小为 N 的自定义字母表将基数 10 的数字转换为基数 (Scala)

转载 作者:行者123 更新时间:2023-12-01 11:04:15 26 4
gpt4 key购买 nike

我想要实现的是通过使用自定义字母表(可以是 UTF-8 字符的任意子集)而不是数字 0-9 来更改正整数的文本表示形式。我想这与使用大小为 N 的字母表(而不是 A-Z 和 0-9)将 base10 数字转换为 baseN 数字是一样的。

在 Scala/Java 中,将 10 进制数字转换为其他进制并不困难(例如使用 Integer.toString(number, radix) ),但上限是 base36 并且没有使用自定义字符的方法。有没有一种优雅的方法来做到这一点?

最佳答案

Scala 不会为你做这件事。

但是只要您的数字采用数字表示形式(例如 Long),数学就非常简单。我在这里只考虑积极的情况;负数需要几个减号。

def baseString(number: Long): String = {
var x = number
var myDigits = List.empty[Char]
while (x > 0) {
myDigits = lookup(x % base) :: myDigits
x = x / base
}
myDigits.mkString
}

现在您有一个包含号码数字的列表(按顺序),假设 lookup 是一个获取数字值并生成字符表示形式的函数。

要读出数字,倒过来也是一样的。如果您的数字已在列表中,则

def stringBase(text: String): Long = {
var x = 0L // Assuming Long, but pick the right type
var dig = text.toList
while (dig.nonEmpty) {
x = x * base + reverseLookup(dig.head)
dig = dig.tail
}
x
}

现在你已经拿回了你的号码。 (reverseLookup 获取字符并生成相应的数值。)

您可以使用以下内容进行测试(尽管您可能希望对无效值引发异常):

val base = 2
def lookup(i: Long) = i match { case 0 => 'f'; case _ => 't' }
def reverseLookup(c: Char) = c match { case 'f' => 0L; case _ => 1L }

关于java - 使用大小为 N 的自定义字母表将基数 10 的数字转换为基数 (Scala),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33105434/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com