Более эффективное решение, чем повторное деление, будет повторяться, если операторы с умножением ... например, (где n - номер, число цифр которого требуется)
unsigned int test = 1;
unsigned int digits = 0;
while (n >= test)
{
++digits;
test *= 10;
}
Если есть некоторая разумная верхняя граница для количества элементов (например, 32-битный диапазон беззнакового целого), тогда еще лучший способ - сравнить с членами некоторого статического массива, например,
// this covers the whole range of 32-bit unsigned values
const unsigned int test[] = { 1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000 };
unsigned int digits = 10;
while(n < test[digits]) --digits;