たまに余計な事に興味を持つんですよ。

数字の桁数を調べる方法はどんなのが良いのだろう、と。

とりあえず、誰でも思いつくであろう4種類を簡単に計測してみた。ソースは次の通り(include等は省略)

#define COUNT_MAX 20000000

int type_A(int n)
{
    int fig = 1;
    while ( (n /= 10) != 0) fig++;
    return fig;
}

int type_B(int n)
{
    n = (n>=0)?n:-n;
    if (n == 0) return 1;
    return log10(n) + 1;
}

int type_C(int n)
{
    char buf[11]; /* INT32_MAXの桁数が10なので11で十分 */
    n = (n>=0)?n:-n;
#if 0
    /* この方が速いけど、glibc 2.0.6までのものでは動かないよ */
    return snprintf(NULL, 0, "%d", n);
#endif
    snprintf(buf, 11, "%d", n); 
    return strlen(buf);
}

int type_D(int n)
{ /*intが4byteであることを決めうちしているので注意*/
    n = (n>=0)?n:-n;
    if      (n >= 1000000000)   return 10;
    else if (n >= 100000000)    return 9;
    else if (n >= 10000000)     return 8;
    else if (n >= 1000000)      return 7;
    else if (n >= 100000)       return 6;
    else if (n >= 10000)        return 5;
    else if (n >= 1000)         return 4;
    else if (n >= 100)          return 3;
    else if (n >= 10)           return 2;
    else                        return 1;
}

double bench(int (*func)(int))
{
    double start, end;
    int i;
    start = clock();
    for (i=0; i

そして結果は(恐らく想像通り)

Bench(A): 3.69000
Bench(B): 6.41000
Bench(C): 17.84000
Bench(D): 0.50000

type_A()とかtype_B()は見た目は知的に見えるけど、所詮type_D()には歯が立たない。if-elseの羅列も悪くないってことね。それだけ。