C ++で数値の桁数を知りたいのですが、どうすればよいですか?たとえば、桁数7676575。
5 に答える
10 を底とする数の対数の上限をとります。(または、より一般的には、基数Nの桁数の「基数 N」。 )
コード内:std::ceil(std::log10(n + 1))
で、必ず#include <cmath>
.
0
(特殊なケースとして入力に対する答えが得られ0
ます。負の数をどうするかはあなた次第です。)
@Knaģisの回答のコードは、定数10による除算がコンパイラによって乗算に変換され、かなり安価であるため、おそらくより効率的です。これがパフォーマンスにとって重要な場合、およびこれが整数型のみに適用される場合は、プロファイリングして比較する必要があります。対数アプローチでは、非常に大きな浮動小数点数の仮想 10 進展開で桁数を計算することもできます。
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);
文字列に入れてその長さを取得するだけです。
int number = getNumberFromSomewhere();
stringstream ss;
ss << number;
size_t numDigits = ss.str().length();
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 が整数であることを確認できます。