34

この質問には単純明快な答えがあるのではないかと心配しています。整列を維持するために必要な最小数の先行ゼロを各項目番号に埋め込むことができるように、項目数の桁数を決定する必要があります。たとえば、合計が 10 未満の場合は先頭にゼロを付けず、10 から 99 の間の場合は 1 を付けるなどです。

1 つの解決策は、アイテム カウントを文字列にキャストしてから、文字数をカウントすることです。うん!より良い方法はありますか?

編集:常用対数を使用することは考えていませんでした(そのようなものが存在することを知りませんでした)。だから、私には明らかではありませんが、間違いなく単純です。

4

10 に答える 10

52

これはそれを行う必要があります:

int length = (number ==0) ? 1 : (int)Math.log10(number) + 1;
于 2009-02-16T20:58:35.697 に答える
12
int length = (int)Math.Log10(Math.Abs(number)) + 1;

負の符号を考慮する必要がある場合があります。

于 2009-02-16T21:00:31.697 に答える
12

繰り返し除算よりも効率的な解決策は、乗算を含むステートメントの場合に繰り返されます...たとえば(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;
于 2009-02-16T21:19:03.913 に答える
4

while ループを使用できます。これは、整数演算のみを使用するため、対数よりも高速になる可能性があります。

int len = 0;
while (n > 0) {
    len++;
    n /= 10;
}

このアルゴリズムをゼロと負の数を処理するように調整することは、読者の課題として残します。

于 2009-02-16T20:59:29.127 に答える
4

.Net で数値をパディングする場合は、

num.ToString().PadLeft(10, '0') 

あなたが望むことをするかもしれません。

于 2009-02-16T21:02:12.737 に答える
2

私はコメントを投稿しただろうが、私の担当者のスコアは私にその区別を与えません.

私が指摘したかったのは、Log(10) は非常に洗練された (コードの行数が非常に少ない) ソリューションですが、おそらくプロセッサに最も負担がかかるソリューションであるということです。

jhericoの答えはおそらく最も効率的な解決策であり、したがって報われるべきだと思います。

特に、これを多くの数に対して行う場合..

于 2009-02-16T23:24:21.930 に答える
1

数値には先行ゼロがないため、とにかく変換​​してそれらを追加しています。とにかく最終結果が文字列でなければならないのに、長さを見つけるためにそれを避けるのに一生懸命努力している理由がわかりません。

于 2009-02-16T21:03:52.813 に答える
0

1 つのソリューションは、10 を底とする対数によって提供されますが、これは少しやり過ぎです。

于 2009-02-16T20:58:44.697 に答える
0

ループして 10 ごとに削除し、ループ回数を数えます。

int num = 423;
int minimum = 1;
while (num > 10) {
    num = num/10;
    minimum++;
}
于 2009-02-16T20:59:35.413 に答える
0

わかりました、私は抵抗できません: 使用します/=:

#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 $ 
于 2009-02-16T21:04:38.443 に答える