2012-06-22 7 views
15

整数の長さの検出方法は?私がle:intテストを持っていた場合(234567545);整数の桁数を取得

intの長さはどのように分かりますか?その中に9個の数字があることを私に伝えたいのですか?

私が試してみました:

char buffer_length[100]; 


    // assign directly to a string. 

    sprintf(buffer_length, "%d\n", 234567545); 

    string sf = buffer_length; 


    cout <<sf.length()-1 << endl; 

しかし、それ以上のクリーンを行うための簡単な方法があり、最も...

+5

考えてみましょう:負の数値はどのように処理する必要がありますか? – Joey

+1

なぜ 'std :: string'が必要ですか?あなたは単に 'strlen(buffer_length)'を行うことができます。 '\ n'と' -1'も必要ありません。 – leemes

+0

可能な複製:http://stackoverflow.com/questions/1489830/efficient-way-to-determine-number-of-digits-in-an-integer – Rishi

答えて

27

どの部門について:

int length = 1; 
int x = 234567545; 
while (x /= 10) 
    length++; 

または使用log10メソッドから<math.h>

log10doubleを返すので、結果を調整する必要があります。

+0

ありがとう! :)私が知る必要があるのは – user1417815

+0

6分で受け入れようとしているので、それはそうです:) – user1417815

+2

'log(0)'は-infinityであり、それを整数に変換するのはUBです。 – Potatoswatter

10

機能してください: "i" は、その後、整数の場合

int count_numbers (int num) { 
    int count =0; 
    while (num !=0) { 
     count++; 
     num/=10; 
    } 
    return count; 
} 
+3

num == 0の場合、これは間違った結果をもたらします。 –

+2

私は前に単純なものを追加することができると思います。 –

+1

あなたの関数は動作しますが..少し遅れています。 – user1417815

3

int len ; 

char buf[33] ; 

itoa (i, buf, 10) ; // or maybe 16 if you want base-16 ? 

len = strlen(buf) ; 

if(i < 0) 
    len-- ; // maybe if you don't want to include "-" in length ? 
+0

'buf [12]'で十分でなければなりません(最大10桁+符号+ '\ 0')。 – leemes

2

stringstream ss; 
int i = 234567545; 
ss << i; 
cout << ss.str().size() << endl; 
+0

それは動作しますが、非常に非効率です。 –

3
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

int main() { 

    int i=2384995; 
    char buf[100]; 

    itoa(i, buf, 10); // 10 is the base decimal 

    printf("Lenght: %d\n", strlen(buf)); 


    return 0; 
} 

以下のようにあなたは、このためstringstreamを使用することができますitoaは標準機能ではないことに注意してください多くのコンパイラでサポートされています。

+0

'buf [12]'で十分でなければなりません(最大10桁+符号+ '\ 0')。 – leemes

0

インターネットを見渡すと、カウンター変数を0に初期化してから、カウントが0に等しくない限り、条件前ループテストに入るのは間違いです。do-whileループは避けるのが最適ですこの。

unsigned udc(unsigned u) //unsigned digit count 
    { 
     unsigned c = 0; 
     do 
     ++c; 
     while ((u /= 10) != 0); 
     return c; 
    } 

それは、UがU < 例のためuneccessary除算、インクリメント、およびCMP命令を避けるために未満であるかどうかをテストするために、おそらく安いです。の場合はの一定の出力に対しては、の場合はと簡単にテストできます。

あなたがむしろ書き込むためのルーチンを記述します。その場合には、桁ごとの指示が、あまりのように魅力的ではないことにinaddition異なる基数に適応し、手で書くことが面倒であるが、保存し
unsigned udc(unsigned u) //unsigned digit count 
    { 
     if (u < 10) return 1; 
     if (u < 100) return 2; 
     if (u < 1000) return 3; 
     //... 
     return 0; //number was not supported 
    } 

ルーチンをプログラムに挿入する前にルーチンを呼び出します。 Cは非常に有限の数字、、32ビット16ビット8ビットをサポートしているため、あらゆる規模の利益のためにルーチンを生成するとき、あなたは単に最大に自分自身を制限することができます。

は、あなたは、単にU U
< かの桁数をカウントする前に否定するだろうと、負の数を考慮するため。もちろん最初にルーチンのサポートを行う番号を署名します。

あなたはU < 1000年、 は、それが代わりにルーチンを作成するの、おそらくちょうど書くことが簡単だということを知っていれば。

if (u > 99) len = 3; 
    else 
    if (u > 9) len = 2; 
    else  len = 1; 
4

誰もが文字列に変換してから長さを取得すると言われているようです。私はこれがどのようにパフォーマンスのわからないんだけど、それは間違いなく、コード:)

int num = 123456; 
int len = to_string(num).length(); 

cout << "LENGTH of " << num << " is " << len << endl; 
// prints "LENGTH of 123456 is 6" 
-1

LEN = 1 +フロア(log10の(N))の1行でそれをしない; // C++コードLIB(cmath)

+0

なぜ、貧しい数字「0」に対する愛はありませんか? –

関連する問題