Все, что вам нужно сделать, это:
1 + floor(log(N)/log(10))
(Это не будет работать на 0. Если вход поплавки, он возвращает количество цифр слева от десятичной точки, и работать только на floats> 0.1.)
Практически наверняка есть инструкция FPU, а не исходная x86, но, конечно же, в расширении, поддерживаемом вашим процессором. Вы можете проверить это, оценивая log(N)
много раз в цикле.
Предполагается, что у вас есть номер, сохраненный как int или float. Если у вас есть номер, хранящийся в виде массива переменной длины, используя некоторую библиотеку, это время O (1), если библиотека предварительно вычисляет длину массива (правильная вещь) и O (N) в противном случае (плохие библиотеки).
Как и во всех поплавковых операциях, точность может быть проблемой, если вы действительно близки к переходу 99-100, 999-1000 и т. Д. Как отмечает Стив Джессоп в комментариях этого ответа, вы можете определить, недооценка в соответствии с желаемой семантикой. Я мог бы даже сказать, что у вас немного свободы: вы можете добавить/вычесть что-то вроде 0,1 из N, если каким-то образом это не удалось для этих номеров перехода (их не так много: вы можете вручную протестировать их все самостоятельно, чтобы убедиться, что это необходимо).
Каков максимальный предел для номера? Или нет такого предела? –
Решение 1 - это * O (log n) * not * O (n) * и, если ваш номер является 'long' или' int' (а не bignum), может быть быстрее, чем решение 2. –
Вы действительно хотите '1 + floor (log (N)/log (10))' – ninjagecko