Scala 数値をN進数として桁ごとに分ける

Scala 数値をN進数として桁ごとに分ける

program

object Main extends App {

  def divideDigits(num: Int, base: Int = 10): List[Int] = {
    def proc(num: Int, base: Int): List[Int] = {
      val quotient = num / base
      val remainder = num % base
      quotient match {
        case 0 => return List(remainder)
        case _ => remainder :: proc(quotient, base)
      }
    }

    proc(num, base).reverse
  }

  for (i <- 100 to 128) {
    val decimalList = divideDigits(i)
    val binaryList = divideDigits(i, 2)
    println("%s : %s".format(decimalList, binaryList))
  }

}

terminal output

List(1, 0, 0) : List(1, 1, 0, 0, 1, 0, 0)
List(1, 0, 1) : List(1, 1, 0, 0, 1, 0, 1)
List(1, 0, 2) : List(1, 1, 0, 0, 1, 1, 0)
List(1, 0, 3) : List(1, 1, 0, 0, 1, 1, 1)
List(1, 0, 4) : List(1, 1, 0, 1, 0, 0, 0)
List(1, 0, 5) : List(1, 1, 0, 1, 0, 0, 1)
List(1, 0, 6) : List(1, 1, 0, 1, 0, 1, 0)
List(1, 0, 7) : List(1, 1, 0, 1, 0, 1, 1)
List(1, 0, 8) : List(1, 1, 0, 1, 1, 0, 0)
List(1, 0, 9) : List(1, 1, 0, 1, 1, 0, 1)
List(1, 1, 0) : List(1, 1, 0, 1, 1, 1, 0)
List(1, 1, 1) : List(1, 1, 0, 1, 1, 1, 1)
List(1, 1, 2) : List(1, 1, 1, 0, 0, 0, 0)
List(1, 1, 3) : List(1, 1, 1, 0, 0, 0, 1)
List(1, 1, 4) : List(1, 1, 1, 0, 0, 1, 0)
List(1, 1, 5) : List(1, 1, 1, 0, 0, 1, 1)
List(1, 1, 6) : List(1, 1, 1, 0, 1, 0, 0)
List(1, 1, 7) : List(1, 1, 1, 0, 1, 0, 1)
List(1, 1, 8) : List(1, 1, 1, 0, 1, 1, 0)
List(1, 1, 9) : List(1, 1, 1, 0, 1, 1, 1)
List(1, 2, 0) : List(1, 1, 1, 1, 0, 0, 0)
List(1, 2, 1) : List(1, 1, 1, 1, 0, 0, 1)
List(1, 2, 2) : List(1, 1, 1, 1, 0, 1, 0)
List(1, 2, 3) : List(1, 1, 1, 1, 0, 1, 1)
List(1, 2, 4) : List(1, 1, 1, 1, 1, 0, 0)
List(1, 2, 5) : List(1, 1, 1, 1, 1, 0, 1)
List(1, 2, 6) : List(1, 1, 1, 1, 1, 1, 0)
List(1, 2, 7) : List(1, 1, 1, 1, 1, 1, 1)
List(1, 2, 8) : List(1, 0, 0, 0, 0, 0, 0, 0)

別の方法

プログラミングコンテストなどでは下記の方法を使うこともよく見られます。

上から2進数, 8進数, 10進数, 16進数。

$ scala

scala> val num = 1000
num: Int = 1000

scala> num.toBinaryString.toList
res0: List[Char] = List(1, 1, 1, 1, 1, 0, 1, 0, 0, 0)

scala> num.toOctalString.toList
res1: List[Char] = List(1, 7, 5, 0)

scala> num.toString.toList
res2: List[Char] = List(1, 0, 0, 0)

scala> num.toHexString.toList
res3: List[Char] = List(3, e, 8)

List[Char] となったり、16進数でeなどが含まれるので扱いづらさはありますが、 例えば数値を8進数にしたとき回文数になっているか、くらいの用途なら使えそうです。