C++ の数値の桁数を数える

胡金庫 2023年10月12日
  1. std::to_string および std::string::size 関数を使用して、C++ の数値の桁数をカウントする
  2. C++ で std::string::erase および std::remove_if メソッドを使用して数値の桁数をカウントする
C++ の数値の桁数を数える

この記事では、数値 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
著者: 胡金庫
胡金庫 avatar 胡金庫 avatar

DelftStack.comの創設者です。Jinku はロボティクスと自動車産業で8年以上働いています。自動テスト、リモートサーバーからのデータ収集、耐久テストからのレポート作成が必要となったとき、彼はコーディングスキルを磨きました。彼は電気/電子工学のバックグラウンドを持っていますが、組み込みエレクトロニクス、組み込みプログラミング、フロントエンド/バックエンドプログラミングへの関心を広げています。

LinkedIn Facebook

関連記事 - C++ Integer