質問
あのシンプルで明らかな答えます。いかに多くの桁幅にカウントの項目ができるよう、パッドの各項目の 最小 番号の先頭に維持に必要なアライメントを実施します。例えば、たいない先頭の場合は < 10が1の場合は10 99等
ついにキャスト項目をカウントを文字列としてカウント文字です。言え!ありそうです。
編集:いと考えていたの 共通の対数値 (知らなかったようなものが存在).では、ないのは明らかでありながら、私がも簡単です。
解決
これはそれを行う必要があります:
int length = (number ==0) ? 1 : (int)Math.log10(number) + 1;
他のヒント
int length = (int)Math.Log10(Math.Abs(number)) + 1;
あなたは負の符号を考慮して必要があるかもしれません..
繰り返し分割より効率的なソリューションは、例えば、...繰り返されます(nは、その数桁の必要とされる数である)
unsigned int test = 1;
unsigned int digits = 0;
while (n >= test)
{
++digits;
test *= 10;
}
が存在する場合、いくつかの合理的な上部次いで、より良い方法は、例えば、いくつかの静的配列のメンバーと比較することである。アイテム数(unsigned int型の例えば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;
あなたは.NETのパッドに番号を予定している場合は、
num.ToString().PadLeft(10, '0')
あなたがやりたいことがあります。
あなたはこれが唯一の整数演算を使用しているため、おそらく対数よりも高速になりますwhileループを、使用することができます
int len = 0;
while (n > 0) {
len++;
n /= 10;
}
私はゼロと負の数を処理するために、このアルゴリズムを調整するために読者の練習としてそれを残しています。
私がコメントを掲載しているだろうが、私の担当者のスコアは私にその区別を許可しません。
解決策、それはおそらくプロセッサ上の1つの最も課税です。私が指摘したかったすべてのログ(10)は非常にエレガントであるにも関わらず(コードの非常に数行読み)ということでした。
私はjhericoの答えは、おそらく最も効率的なソリューションであるため、このようなとして報われるべきだと思います。
あなたは数字の多くのためにこれをやってしようとしている場合は特に..
多くないの先頭にゼロがいに変換するかを追加します。なんなのかんしようとしていく動きが出始めている、長さが結果について文字列。
一つの解決策は、10を底とする対数、ビット過剰で提供されます。
あなたがループを通って、10により削除することができ、回数をカウントしますループ;
int num = 423;
int minimum = 1;
while (num > 10) {
num = num/10;
minimum++;
}
さて、私は抵抗することはできません。/=
を使用します:
#include <stdio.h>
int
main(){
int num = 423;
int count = 1;
while( num /= 10)
count ++;
printf("Count: %d\n", count);
return 0;
}
534 $ gcc count.c && ./a.out
Count: 3
535 $