たまに余計な事に興味を持つんですよ。
数字の桁数を調べる方法はどんなのが良いのだろう、と。
とりあえず、誰でも思いつくであろう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の羅列も悪くないってことね。それだけ。