27 lines
969 B
Scala
27 lines
969 B
Scala
import Stream._
|
|
|
|
object MDR extends App {
|
|
|
|
def mdr(x: BigInt, base: Int = 10): (BigInt, Long) = {
|
|
def multiplyDigits(x: BigInt): BigInt = ((x.toString(base) map (_.asDigit)) :\ BigInt(1))(_*_)
|
|
def loop(p: BigInt, c: Long): (BigInt, Long) = if (p < base) (p, c) else loop(multiplyDigits(p), c+1)
|
|
loop(multiplyDigits(x), 1)
|
|
}
|
|
|
|
printf("%15s\t%10s\t%s\n","Number","MDR","MP")
|
|
printf("%15s\t%10s\t%s\n","======","===","==")
|
|
Seq[BigInt](123321, 7739, 893, 899998, BigInt("393900588225"), BigInt("999999999999")) foreach {x =>
|
|
val (s, c) = mdr(x)
|
|
printf("%15s\t%10s\t%2s\n",x,s,c)
|
|
}
|
|
println
|
|
|
|
val mdrs: Stream[Int] => Stream[(Int, BigInt)] = i => i map (x => (x, mdr(x)._1))
|
|
|
|
println("MDR: [n0..n4]")
|
|
println("==== ========")
|
|
((for {i <- 0 to 9} yield (mdrs(from(0)) take 11112 toList) filter {_._2 == i})
|
|
.map {_ take 5} map {xs => xs map {_._1}}).zipWithIndex
|
|
.foreach{p => printf("%3s: [%s]\n",p._2,p._1.mkString(", "))}
|
|
|
|
}
|