Вы можете использовать рекурсивное решение вместо цикла, но как-то похоже:
@tailrec
def digits (i: Long, carry: Int=1) : Int = if (i < 10) carry else digits (i/10, carry+1)
digits (8345012978643L)
При использовании длинных изображений картина может измениться - измерьте маленькие и длинные числа независимо от разных алгоритмов и выберите подходящий, в зависимости от вашего типичного ввода. :)
Конечно, ничто не сравнится с переключателем:
switch (x) {
case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7: case 8: case 9: return 1;
case 10: case 11: // ...
case 99: return 2;
case 100: // you get the point :)
default: return 10; // switch only over int
}
кроме простого массива:
int [] size = {1,1,1,1,1,1,1,1,1,2,2,2,2,2,... };
int x = 234561798;
return size [x];
Некоторые люди скажут вам оптимизировать размер кода, но, как известно, преждевременная оптимизация ...