3

C ++で数値の桁数を知りたいのですが、どうすればよいですか?たとえば、桁数7676575。

4

5 に答える 5

11

10 を底とする数の対数の上限をとります。(または、より一般的には、基数Nの桁数の「基数 N」 )

コード内:std::ceil(std::log10(n + 1))で、必ず#include <cmath>.

0(特殊なケースとして入力に対する答えが得られ0ます。負の数をどうするかはあなた次第です。)

@Knaģisの回答のコードは、定数10による除算がコンパイラによって乗算に変換され、かなり安価であるため、おそらくより効率的です。これがパフォーマンスにとって重要な場合、およびこれが整数型のみに適用される場合は、プロファイリングして比較する必要があります。対数アプローチでは、非常に大きな浮動小数点数の仮想 10 進展開で桁数を計算することもできます。

于 2012-11-12T18:03:53.017 に答える
7
int i = 7676575;
int digits = i == 0 ? 1 : 0;
i = abs(i); // handle negative numbers as well
while (i > 0)
{
    digits++;
    i /= 10;
}

// -or- if you prefer do/while then a shorter sample (by Kerrek SB)

int i = 7676575;
int digits = 0;
i = abs(i); // handle negative numbers as well
do { digits++; } while (i /= 10);
于 2012-11-12T18:04:21.407 に答える
0

文字列に入れてその長さを取得するだけです。

int number = getNumberFromSomewhere();

stringstream ss;

ss << number;
size_t numDigits = ss.str().length();
于 2012-11-12T18:08:15.373 に答える
0
template <typename T>
int getdigits(T v)
{
T i = std::abs(v);
if (i < 10) return 1;
else if (i < 100) return 2;
...
else if (i < 100000000) return 8;
else if (i < 1000000000) return 9;
}

など、int だけでなく、長距離を含めるように拡張できます。これが除算よりも速いかどうかはわかりませんが、そうでないのはなぜですか - それはちょうど10回の比較です.

テンプレートの黒魔術を使用して、必要な数の if のみを使用して関数を生成できると思いますが、本当に気にする人はいません。ただし、std::enable_if<std::is_integer<T>::value> を使用して、T が整数であることを確認できます。

于 2012-11-12T18:12:06.667 に答える