20

整数の長さを検出するにはどうすればよいですか? 私がleを持っていた場合: int test(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;

しかし、それを行うためのより簡単な方法またはよりクリーンな方法があるはずです...

4

8 に答える 8

38

分割はどうですか:

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

または のlog10メソッドを使用し<math.h>ます。

log10返すdoubleので、結果を調整する必要があることに注意してください。

于 2012-06-22T07:03:28.583 に答える
10

関数を作る:

int count_numbers ( int num) {
   int count =0;
   while (num !=0) {   
      count++;  
      num/=10;
   } 
   return count;
}
于 2012-06-22T07:05:28.347 に答える
5

stringstream以下に示すように、これに使用できます

stringstream ss;
int i = 234567545;
ss << i;
cout << ss.str().size() << endl;
于 2012-06-22T07:20:33.083 に答える
4
#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;
}

多くのコンパイラでサポートされている場合でも、itoaは標準関数ではないことに注意してください。

于 2012-06-22T07:21:41.683 に答える
4

「i」が整数の場合、

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 ?
于 2012-06-22T07:18:28.840 に答える
0

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

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

u < 10の場合に不必要な除算、インクリメント、および cmp 命令を避けるために、uが10未満であるかどうかをテストする方がおそらく安価です。

しかし、その主題である最適化については、 uを定数の10乗に対して単純にテストできます。

    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
    }

これにより、桁ごとに3 つの命令が節約されますが、魅力的でなく、手で書くのが面倒であることに加えて、さまざまな基数への適応性が低くなります。C は64bit32bit16bit8bitという非常に有限の数しかサポートしていないため、ルーチンを生成するときに単純に最大値に制限して、すべてのサイズにメリットをもたらすことができます。

負の数を考慮するには、桁数を数える前にu < 0の場合は単にuを否定します。 もちろん、最初にルーチンが符号付き番号をサポートするようにします。

u < 1000であることがわかっている場合は、ルーチンを記述するよりも、単純に記述する方がおそらく簡単です。

   if (u > 99) len = 3;
   else
   if (u > 9)  len = 2;
   else        len = 1;
于 2015-04-23T03:04:57.273 に答える