Cheira-me que é mais as "n" divisões inteiras. Qual é a rapidez da instrução x86 DIV ou IDIV?
Tirando algoritmos com look-up tables ou fazer as contas em base 2 com shifts e depois passar para base 10 (implica uma ou duas divisões em vírgula flutuante)... sei lá...
Depende do que se pretende. Em alguns casos até a opção INT->STRING ->STRLEN pode ser encarada. Depende da "pressão"
Se o número em questão for, por exemplo, um googol (n = 10^100, mais que o número de partículas subatómicas no universo observável), são 101 dígitos, logo 101 divisões e não 10^100!
Numa máquina de 32 bits só consegues representar números até 2^32, que tem 10 dígitos. Numa de 64 bits, são 20 dígitos. Logo, na pior das hipóteses, 20 divisões, 20 incrementos e 21 comparações. Nada mau...
Com logaritmos... Bem, calcular logaritmos implica o uso de vírgula flutuante, logo cast para float/double e cast para inteiro no fim. O que é complicado é o logaritmo. Não sei como será calculado numa FPU actual, mas de certeza que é uma operação mais pesada que divisões.
Mas, qualquer destas duas situações funciona completamente dentro do processador, porque podem ser executadas apenas em registos.
Agora, fazer uma string implica acesso à memória. Pois, enquanto escreves a string na memória, o processador tem tempo para fazer as divisões todas ou até mesmo o cálculo do logaritmo. Depois ainda tens de contar os caracteres...
E... para fazer a string a partir de um inteiro usa-se um algoritmo semelhante ao que eu apresentei...
Peço desculpa pelo
core dump...