C++ の数値の桁数を数える
胡金庫
2023年10月12日
-
std::to_string
およびstd::string::size
関数を使用して、C++ の数値の桁数をカウントする -
C++ で
std::string::erase
およびstd::remove_if
メソッドを使用して数値の桁数をカウントする
この記事では、数値 C++ の桁数を数える方法に関する複数の方法を示します。
std::to_string
および std::string::size
関数を使用して、C++ の数値の桁数をカウントする
数値の桁数をカウントする最も簡単な方法は、それを std::string
オブジェクトに変換してから、std::string
の組み込み関数を呼び出してカウント数を取得することです。この場合、単一の引数を取り、整数型と見なされ、サイズを整数として返す別個のテンプレート関数 countDigits
を実装しました。次の例では、符号記号もカウントされるため、負の整数に対して誤った数値が出力されることに注意してください。
#include <iostream>
#include <string>
#include <vector>
using std::cerr;
using std::cout;
using std::endl;
using std::string;
using std::to_string;
template <typename T>
size_t countDigits(T n) {
string tmp;
tmp = to_string(n);
return tmp.size();
}
int main() {
int num1 = 1234567;
int num2 = -1234567;
cout << "number of digits in " << num1 << " = " << countDigits(num1) << endl;
cout << "number of digits in " << num2 << " = " << countDigits(num2) << endl;
exit(EXIT_SUCCESS);
}
出力:
number of digits in 1234567 = 7
number of digits in -1234567 = 8
関数 countDigits
の以前の実装の欠陥を修正するために、単一の if
ステートメントを追加して、指定された数値が負であるかどうかを評価し、1つ小さい文字列サイズを返します。数値が 0
より大きい場合、次のサンプルコードで実装されているように、文字列サイズの元の値が返されることに注意してください。
#include <iostream>
#include <string>
#include <vector>
using std::cerr;
using std::cout;
using std::endl;
using std::string;
using std::to_string;
template <typename T>
size_t countDigits(T n) {
string tmp;
tmp = to_string(n);
if (n < 0) return tmp.size() - 1;
return tmp.size();
}
int main() {
int num1 = 1234567;
int num2 = -1234567;
cout << "number of digits in " << num1 << " = " << countDigits(num1) << endl;
cout << "number of digits in " << num2 << " = " << countDigits(num2) << endl;
exit(EXIT_SUCCESS);
}
出力:
number of digits in 1234567 = 7
number of digits in -1234567 = 7
C++ で std::string::erase
および std::remove_if
メソッドを使用して数値の桁数をカウントする
前の例は、上記の問題に対して完全に十分な解決策を提供しますが、std::string::erase
関数と std::remove_if
関数の組み合わせを使用して countDigits
をオーバーエンジニアリングし、数字以外の記号を削除することができます。このメソッドは、浮動小数点値を処理できる関数を実装するための足がかりになる可能性があることにも注意してください。ただし、次のサンプルコードは浮動小数点値と互換性がありません。
#include <iostream>
#include <string>
#include <vector>
using std::cerr;
using std::cout;
using std::endl;
using std::string;
using std::to_string;
template <typename T>
size_t countDigits(T n) {
string tmp;
tmp = to_string(n);
tmp.erase(std::remove_if(tmp.begin(), tmp.end(), ispunct), tmp.end());
return tmp.size();
}
int main() {
int num1 = 1234567;
int num2 = -1234567;
cout << "number of digits in " << num1 << " = " << countDigits(num1) << endl;
cout << "number of digits in " << num2 << " = " << countDigits(num2) << endl;
exit(EXIT_SUCCESS);
}
出力:
number of digits in 1234567 = 7
number of digits in -1234567 = 7
著者: 胡金庫