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

标签 java scala math

我想要实现的是通过使用自定义字母表(可以是 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/

相关文章:

java - java连接数据库的驱动

java - 数据流管道和发布订阅模拟器

Scala - lambda 参数可以匹配元组吗?

scala - Scala 和 Google 'Go' 语言之间是否有比较(逐个功能)?

c++ - 最大和最小数显示错误

math - 相同的方程但不同的答案

math - 什么是多精度整数?

java - Javafx 中有 RSyntaxTextArea 的替代品吗?

java - 单元测试失败: mockS3FileRead NullPointerException

scala - 将任一列表转换为猫 ValidatedNel