/** * You can edit, run, and share this code. * play.kotlinlang.org */ import kotlin.math.* fun main() { println(f(190f)) println(f(191f)) println(f(192f)) println(f(3553f)) } fun f(x: Float): Float{ println("input = " + x) var keta=1 while(x>=numKeta(keta)){ keta++ } println("keta = " + keta) if(keta == 1){ return x }else{ val to0 = numKeta(keta-1)%keta var flag: Float flag = x%keta-to0 if(flag < 0){ flag = keta + flag } val num = floor((x-numKeta(keta-1))/(keta)) +10f.pow(keta-1) //0を0として何個目か println("0を0として何個目か : " + num) println("no nankomeka : " + flag) var k: Array = arrayOfNulls(keta) for(i in keta-1 downTo 0){ val diff = keta-(i+1) k[i] = floor(num/10f.pow(i)) - minusNum(k, keta, diff) } return k[keta-1-flag.toInt()]!! } return -x } fun minusNum(k: Array, keta:Int, diff: Int): Int{ if(diff==0){ return 0 }else if(diff<0){ println("ERROR001") return -1 }else{ var sum: Float = 0f for(i in 0..diff-1){ // println("in munusNum, i : " + i) // println("in munusNum, keta-i : " + (keta-i)) sum += k[keta-(i+1)]!!*10f.pow(diff-i) } return sum.toInt() } } fun numKeta(keta: Int): Int{ //桁までの数字の数 var sum = 0 for(i in 1..keta){ sum += forSigNumKeta(i) } return sum } fun forSigNumKeta(n: Int): Int{ if(n<=0){ println("ERROR") return -1 } if(n == 1){ return 10 }else{ return (9*10f.pow(n-1)*n).toInt() } }