(This task is taken from a   Project Euler   problem.)

(All numbers herein are expressed in base ten.)


27   =   128   and   7   is
the first power of   2   whose leading decimal digits are   12.

The next power of   2   whose leading decimal digits
are   12   is   80,

280   =   1208925819614629174706176.



Define        p(L,n)      to be the  nth-smallest
value of    j    such that the base ten representation
of    2j    begins with the digits of    L .

    So   p(12, 1) =  7    and
         p(12, 2) = 80



You are also given that:

         p(123, 45)   =   12710



Task

   find: 
     p(12, 1)  
     p(12, 2)  
     p(123, 45)  
     p(123, 12345)  
     p(123, 678910)  
   display the results here, on this page.


let ld10 = log(2.0) / log(10.0)
 
func p(L: Int, n: Int) -> Int {
  var l = L
  var digits = 1
 
  while l >= 10 {
    digits *= 10
    l /= 10
  }
 
  var count = 0
  var i = 0
 
  while count < n {
    let rhs = (Double(i) * ld10).truncatingRemainder(dividingBy: 1)
    let e = exp(log(10.0) * rhs)
 
    if Int(e * Double(digits)) == L {
      count += 1
    }
 
    i += 1
  }
 
  return i - 1
}
 
let cases = [
  (12, 1),
  (12, 2),
  (123, 45),
  (123, 12345),
  (123, 678910)
]
 
for (l, n) in cases {
  print("p(\(l), \(n)) = \(p(L: l, n: n))")
}