-
C++で巨大な数値を扱う方法:Boostライブラリのmultiprecision活用
C++では標準の整数型だけでは表現できない巨大な数値も、Boostライブラリを使えば簡単に扱うことができます。BoostはC++で最も広く利用されている定番ライブラリの一つで、さまざまな分野に対応した豊富な機能を提供しています。その中でもmultiprecisionモジュールを使えば、264をはるかに超えるような大きな数値でも問題なく演算できます。この記事では、Boostライブラリを使った多倍長整数の扱い方を、実際のコード例とともに解説します。固定精度の整数型(int128_t、int256_tなど)boost::multiprecision名前空間には、int128_t、int256_t、i
-
LinuxでC++を使ってミリ秒単位の時間を取得する方法
この記事では、Linux環境のC++で現在時刻やプログラムの経過時間をミリ秒単位で取得する方法を解説します。 timeval構造体とgettimeofday()関数 Linuxでは、<sys/time.h>ヘッダーに用意されているgettimeofday()関数とtimeval構造体を利用することで、高精度な時刻を取得できます。timeval構造体は主に次の2つのメンバーを持っています。 tv_sec: 1970年1月1日(エポック)からの経過秒数 tv_usec: 秒未満のマイクロ秒部分 処理の開始時と終了時にそれぞれ時刻を取得し、その差分を計算することで、ミリ秒単位の経過時
-
C++でnewを使ってオブジェクトを生成する場合と、newを使わずに生成する場合の違いとは?
C++では、クラスのオブジェクトを生成する方法として、「newキーワードを使う方法」と「newキーワードを使わない方法」の2通りがあります。 newを使わずに生成した場合、そのオブジェクトは通常の自動変数として扱われ、スタック領域に格納されます。この場合、宣言されたスコープ(ブロックや関数)が終了すると、オブジェクトは自動的に破棄されるため、メモリ管理の手間がかかりません。 一方、オブジェクトのサイズが実行時まで確定しない場合や、スコープを超えてオブジェクトを生存させたい場合には、動的にメモリを確保する必要があります。その際は、クラスへのポインタを作成し、new演算子を使ってインスタンスを生成
-
Linuxターミナルで色付きテキストを出力する方法を解説
Linuxターミナルで色付きテキストを出力する方法 Linuxターミナルに色付きのテキストを出力する方法を解説します。C++のコードに特別なライブラリや複雑な処理を追加する必要はありません。「ANSIエスケープシーケンス」と呼ばれるターミナル制御用の特殊文字列を利用するだけで、文字色・背景色・太字などの装飾を自由に設定できます。 基本の書式 色付きテキストの出力には、次のような形式を使用します。 \033[1;31m Sample Text \033[0m 各部分の意味は以下のとおりです。 \033:ESC文字(8進数の27)。エスケープシーケンスの開始を示します [1;31:スタイルと色の
-
コンパイラが使用しているC++標準のバージョンを確認する方法(__cplusplusマクロ)
C++でプログラムを開発していると、現在コンパイラがどのC++標準に準拠してコンパイルを行っているのかを確認したい場面があります。そんなときに役立つのが、__cplusplusという定義済みマクロです。このマクロは、コンパイラが採用しているC++標準のバージョンに応じて、あらかじめ決められた値を返します。標準ごとの__cplusplusの値標準規格__cplusplus の値C++98以前1C++98199711LC++98 + TR1判別不可(C++98として扱われる)C++11201103LC++14201402LC++17201703Lサンプルコード以下のコードでは、__cplusplu
-
C++でコンソール画面をクリアする方法をわかりやすく解説
C++のプログラムからコンソール(ターミナル)画面に表示された内容を消去したい場合、system()関数を使ってOSのコマンドを実行するのが一般的な方法です。この関数は標準ライブラリ<cstdlib>で定義されており、引数として渡した文字列をシェルコマンドとして実行してくれます。クリアに使うコマンドはOSによって異なります。Linux / macOS:POSIX環境で動作する「clear」コマンドを使用Windows:コマンドプロンプト用の「cls」コマンドを使用Linuxでコンソールをクリアするサンプルコード以下は、Linux環境で「clear」コマンドをsystem()関数に渡
-
LinuxでC++を使ってディレクトリツリーを作成する方法
この記事では、Linux環境においてC++のコードからディレクトリツリー(階層構造を持つディレクトリ)を作成する方法を解説します。 mkdirコマンドの基本 まず、Linuxターミナルでの基本的な方法を確認しましょう。ターミナルでは以下のようなコマンドを実行することで、一括してディレクトリを作成できます。 mkdir -p /dir/dir1/dir2 ここで重要なのが -p オプションです。このオプションを指定すると、親ディレクトリが存在しない場合でも、必要な上位ディレクトリを再帰的に自動作成してくれます。オプションを付け忘れると、親ディレクトリが存在しない場合にエラーとなるため注意が必要で
-
C++とLinuxで高精度タイマーを作成する方法
C++で高精度タイマーを作成するには、標準ライブラリの chrono を利用するのが最も簡単な方法です。chrono ライブラリには高解像度クロックが用意されており、ナノ秒単位という非常に細かい精度で時間を計測できます。本記事では、プログラムの実行時間をナノ秒単位で計測するサンプルを紹介します。基本的な流れは以下の通りです。計測開始時点の時刻を取得する計測終了時点の時刻を取得する両者の差分を計算し、経過時間を求めるここでは例として、空のループを回すことで一定の負荷を発生させ、その処理にかかる時間を計測します。サンプルコード#include <iostream> #include &
-
C++でbool型をint型に変換する方法
この記事では、C++においてbool型(ブール値)をint型(整数値)へ変換する方法を解説します。boolはC++の基本データ型の一つで、true(真)またはfalse(偽)というキーワードで表現されます。bool型の値を整数値として扱いたい場合は、型キャスト(typecasting)を使用します。変換のルールは非常にシンプルで、trueは常に1、falseは常に0に対応します。サンプルコード以下のコードでは、int()による明示的な型キャストを使って、bool型の値を整数値に変換して出力しています。#include <iostream> using namespace std;
-
計算量の制約を満たしながらn個の要素から2番目に小さい値を見つけるC++プログラム
本記事では、指定された計算量の制約(O(n)の1回走査)を満たしながら、n個の要素の中から2番目に小さい値を見つけるC++プログラムを紹介します。配列をソートする方法(O(n log n))もありますが、ここで紹介するアルゴリズムは配列を一度だけ走査すればよいため、より効率的です。アルゴリズムBegin function SecondSmallest() : /* この関数の引数: 配列へのポインタ a 要素数 n */ // 関数の処理内容: 最小値を追跡するための変数 s1 を宣言
-
【C++】n個の数値からなる集合Sの中で、中央値に最も近いk個の数を見つける方法
本記事では、n個の数値からなる集合Sが与えられたとき、その中央値(メジアン)に最も近いk個の数を求めるC++プログラムを紹介します。この問題は、まずクイックソートでデータを並べ替え、その後中央値を基準として左右にポインタを広げながら近い順に要素を選んでいくというアプローチで解くことができます。アルゴリズムの概要処理は大きく分けて「パーティション(分割)」「クイックソート」「中央値からの探索」の3段階で構成されます。1. partition関数:配列の分割配列a[]の末尾の値(high)をピボットとして扱い、それより小さい要素を左側に集めることで配列を分割します。Begin functi
-
【C++】順序統計アルゴリズムでリストからi番目に大きい数を求める方法
この記事では、順序統計アルゴリズム(Order-Statistic Algorithm)を用いて、指定されたリスト(配列)の中から i 番目に大きい数を求めるC++プログラムを紹介します。この手法は、二分探索木(BST)にデータを挿入し、各ノードにランク(順位)を割り当てることで、任意の順位の要素を効率的に取り出せる点が特徴です。アルゴリズムの概要全体の流れは「挿入 → ランク割り当て → 選択」の3つのステップで構成されています。それぞれの関数の動作を詳しく見ていきましょう。1. Insert():木へのノード挿入引数として根(root)と挿入する値 d を受け取ります。木が完全に空の場合は
-
【C++】データセット内のモード(最頻値)を見つけるプログラム
これは、データセットの中からモード(最頻値)を求めるためのC++プログラムです。連結リストを使用して重複しないデータを管理し、各要素の出現回数をカウントすることで、最も多く出現した値を効率的に特定します。 アルゴリズム 開始 セットにデータを挿入する関数 insertinset() を定義する。 新しいノード(newnode)と一時ノード(t)を作成する。 newnode を使って、リストに挿入するノードを準備する。 head が NULL の場合は、 新しいノードを head に代入し、カウントを1増やす。 挿入の過程で挿入ソートを実行し、常にデータをソートされ
-
二分探索を使って特定の数値の出現回数を求めるC++プログラム
本記事では、二分探索(バイナリサーチ)の考え方を応用し、指定した数値がデータ集合の中に何回出現するかを効率的に求めるC++プログラムを紹介します。 このプログラムのポイントは、二分探索木(BST)の各ノードに「出現回数」を記録するカウンタを持たせている点です。同じ値が挿入されるたびに新規ノードを作成するのではなく、既存ノードのカウントを増やすことで、重複データをコンパクトに管理できます。そのため、検索時には木をたどるだけで、目的の数値の出現回数を高速に取得できます。 アルゴリズム 挿入処理(Insert関数) 引数で渡されたデータを持つ新しいノードを作成します。 木が完全に空の場合は、新しい
-
C++で実装するAlexander Bogomolnyの順列生成アルゴリズム ― 1からNまでの全順列を出力する方法
本記事では、1からNまでの自然数のすべての順列を生成するAlexander Bogomolnyの非順序順列アルゴリズム(UnOrdered Permutation Algorithm)をC++で実装する方法を解説します。このアルゴリズムは再帰呼び出しとバックトラックを組み合わせることで、N個の要素からなるすべての並べ替えパターン(N!通り)を漏れなく列挙できます。 アルゴリズムの流れ このアルゴリズムでは、静的変数 l で現在のレベル(配置済みの要素数)を管理し、配列 Val[] の空きスロット(値が0の位置)へ順に数値を配置していきます。レベルがNに達すると1つの順列が完成して表示され、そ
-
C++で数値リストのすべての組み合わせを生成する方法(再帰アルゴリズム解説)
この記事では、与えられた数値リストから考えられるすべての組み合わせを生成するC++プログラムを紹介します。長さ1から配列の要素数まで、各長さごとの組み合わせを再帰的なアルゴリズムで効率よく列挙します。 アルゴリズムの概要 このプログラムは、各要素について「選ぶ/選ばない」という2つの選択肢を再帰的に評価することで、すべての組み合わせを網羅します。処理の流れは以下のとおりです。 Begin 要素数と各要素を入力として受け取る。 関数 Combi(char a[], int reqLen, int s, int currLen, bool check[], int l) :
-
特定の文字列からN文字のシーケンスを生成するC++プログラム
この記事では、指定された元の文字列(ベース文字列)をもとに、同じ文字を重複させずに長さNのシーケンス(文字列)を複数個生成するC++プログラムを紹介します。標準ライブラリの rand() 関数でランダムなインデックスを選択することで、実行のたびに異なる組み合わせのシーケンスを作り出せます。 アルゴリズム 開始 関数 GenerateSequence():特定のケースに対してN文字のシーケンスを生成する rand() を使ってランダムなインデックスを生成する 最初の文字はそのままシーケンスに格納する 2文字目以降は、すでに使用済みの文字な
-
C++で漸化式を使って組み合わせ(nCr)を計算するプログラムの解説
本記事では、漸化式(再帰関係)を利用して組み合わせ nCr を求める C++ プログラムを紹介します。組み合わせとは、n 個の要素から r 個を選ぶときの選び方の総数のことであり、数学的には次の公式で定義されます。 nCr = n! / (r! × (n−r)!) この公式をそのまま階乗で計算すると数が巨大化しやすいため、本プログラムでは次のような漸化式の性質を利用して再帰的に計算を行います。 nCr = (n / r) × (n−1)C(r−1) アルゴリズム Begin function CalCombination(): 引数:n, r 関数の処理
-
C++で整数分割(パーティション)を生成するプログラムの実装方法
本記事では、特定のケースにおける整数分割(Integer Partition)を実行するC++プログラムを紹介します。整数分割とは、ある正の整数 n を、正の整数の和として表現するすべての一意な組み合わせを求める問題です。 例えば n = 7 の場合、「7」「6+1」「5+2」「5+1+1」…といった具合に、順序の違いだけの重複を除いた形ですべての分割パターンを出力します。 アルゴリズムの流れ このプログラムは、現在の分割を表示しながら次の分割を順次生成していく手法を採用しています。大まかな手順は以下の通りです。 分割配列 p[] の末尾インデックス k を 0 に初期化します。 最初の分割
-
【C++】バイナリカウント法で集合の部分集合をすべて生成するプログラムの実装方法
この記事では、バイナリカウント法(Binary Counting Method)を用いて、集合のすべての部分集合を生成するC++プログラムを紹介します。 バイナリカウント法の基本的な考え方 n 個の要素を持つ集合の部分集合の総数は 2^n 個になります。0 から 2^n − 1 までの各整数を n 桁の2進数で表すと、各ビットが「対応する要素を部分集合に含める(1)か、含めない(0)か」を表すことになります。この性質を利用すれば、2進数を1ずつ増やしていくだけで、すべての部分集合を漏れなく列挙できます。 アルゴリズム Begin 配列の要素を入力として受け取る。 関数 Bina