Вероятно, намного быстрее, чем при использовании преобразования журнала или преобразования строки в строку и без использования каких-либо библиотечных функций, это:
int nDigits(int i)
{
if (i < 0) i = -i;
if (i < 10) return 1;
if (i < 100) return 2;
if (i < 1000) return 3;
if (i < 10000) return 4;
if (i < 100000) return 5;
if (i < 1000000) return 6;
if (i < 10000000) return 7;
if (i < 100000000) return 8;
if (i < 1000000000) return 9;
return 10;
}
РЕДАКТИРОВАТЬ после того, как Джефф Йейтс обеспокоен:
Для тех, кто беспокоится о размерах int, отличных от 32-битных (аналогично решению pmg, но все же быстрее, потому что умножение быстрее деления: -)
#include <limits.h>
#define PO10_LIMIT (INT_MAX/10)
int nDigits(int i)
{
int n,po10;
if (i < 0) i = -i;
n=1;
po10=10;
while(i>=po10)
{
n++;
if (po10 > PO10_LIMIT) break;
po10*=10;
}
return n;
}