-
C++における関数のオーバーロードとオーバーライドの違い
C++には、同じ名前の関数を扱う仕組みとして「オーバーロード(多重定義)」と「オーバーライド(上書き)」があります。この2つは名前が似ているため混同されやすいですが、目的も動作のタイミングもまったく異なります。本記事では、それぞれの特徴と違いをわかりやすく解説します。 オーバーロード(Overloading)とは オーバーロードとは、同じ名前の関数を、引数の個数や型を変えて複数定義できる機能です。 特別なキーワードは不要で、通常の関数定義と同じように記述します。 関数のシグネチャ(プロトタイプ)は、引数の個数または型が異なっている必要があります。戻り値の型だけが異なる場合はオーバーロードでき
-
【C++】k-ラフ数(k-ジャグ数)の判定方法をわかりやすく解説
k-ラフ数(k-ジャグ数)とは? ある整数の最小の素因数が、指定された値 k 以上であるとき、その数は k-ラフ数(k-rough number) または k-ジャグ数(k-jagged number) と呼ばれます。 例えば、75 の素因数は 3、5、5 なので、最小の素因数は 3 です。したがって、75 は「3-ラフ数」ですが、「5-ラフ数」ではありません。 このチュートリアルでは、与えられた数 n が k-ラフ数であるかどうかを判定する C++ プログラムを作成します。 解決の手順 数値 n と k を初期化します。 n の約数となるすべての素数を見つけ、ベクターに格納します。 ベクタ
-
C++でaのb乗(a^b)の右からk桁目の数字を求める方法
はじめにこのチュートリアルでは、C++を使って ab(aのb乗)の右側から数えてk番目の桁の数字を求めるプログラムを作成します。これは非常にシンプルな問題です。解決までの手順を順番に見ていきましょう。解決の手順数値a、b、kを初期化します。pow関数を使用して ab の値を計算します。累乗値が0より大きく、かつカウントがk未満である間、ループ処理を行います。累乗値の1の位(最後の桁)を取得します。カウンターを1つ増やします。kとカウンターが等しいかどうかを判定します。等しい場合は、その桁の数字を返します。条件を満たさなかった場合は-1を返します。コード例それでは、実際のコードを見てみましょう。
-
C++で2つのソート済み配列をマージしてK番目の要素を求める方法
このチュートリアルでは、2つのソート済み配列をマージ(統合)した配列から、K番目の要素を見つけるプログラムをC++で作成します。まず、問題を解くための手順を確認しましょう。2つのソート済み配列を初期化します。サイズ m + n の空の配列を用意します。2つの配列を新しい配列にマージします。マージ後の配列から k - 1 番目の要素を返します。このアルゴリズムは、マージソートの要領で2つの配列の先頭同士を比較しながら小さい方を順に格納していくことで、全体をソートされた状態で統合できるのがポイントです。マージ処理の計算量は O(m + n) となります。サンプルコードそれでは、実際のコードを見てみ
-
【C++】最大ヒープからK番目に大きい要素を優先度付きキューで効率よく求める方法
このチュートリアルでは、最大ヒープ(max-heap)から K番目に大きい要素 を取り出すプログラムをC++で実装します。この問題は、優先度付きキュー(priority queue)を使うことで、ヒープ全体をソートすることなく効率的に解くことができます。アルゴリズムの流れは以下の通りです。アルゴリズムの手順最大ヒープを正しい値で初期化します。優先度付きキューを作成し、ヒープのルートノードを挿入します。ループを k - 1 回繰り返します。キューから最大の要素を取り出します(pop)。取り出したノードの左の子と右の子を優先度付きキューに追加します。ループ終了後、優先度付きキューの先頭にある要素が
-
C++でソートされていない配列からk番目に欠落している要素を見つける方法
このチュートリアルでは、与えられたソートされていない配列の中から、k番目に欠落している要素を見つけるプログラムを作成します。具体的には、配列内の最小値から最大値までの範囲において存在しない数値を順に数え、そのうちk番目のものを特定します。それでは、問題を解くための手順を順番に見ていきましょう。解決手順ソートされていない配列を初期化します。すべての要素をセット(unordered_set)に挿入し、高速な存在判定を可能にします。配列から最大値と最小値を求めます。最小値から最大値まで走査するループを作成し、カウント用の変数を管理します。現在の数値がセットに存在しない場合、カウントを1増やします。カ
-
C++でソート済み配列からk番目に欠落している要素を求める方法
このチュートリアルでは、与えられたソート済み配列の中からk番目に欠落している要素を効率的に見つけるプログラムをC++で作成します。例えば、配列 {1, 2, 3, 5, 10} の場合、最小値1から最大値10までの間に存在しない数値は「4, 6, 7, 8, 9」です。この中で3番目に欠けている数は「7」となります。それでは、問題を解くための手順を見ていきましょう。アルゴリズムの手順ソート済み配列を初期化します。変数 difference と count を宣言し、count を k で初期化します(まだ見つかっていない欠落要素の残り個数を管理します)。配列を先頭から順に走査します。現在の要素
-
C++で自然数から指定された整数を削除した後のK番目に小さい数を求める方法
このチュートリアルでは、自然数からいくつかの整数を削除した後に残る要素の中から、K番目に小さい数を見つけるプログラムを作成します。問題の概要整数の配列と値kが与えられます。自然数の列から、与えられた配列に含まれるすべての要素を取り除き、残った自然数の中でk番目に小さい数を求めるのが目的です。例えば、配列が {3, 5}、k = 2 の場合、自然数は 1, 2, 4, 6, 7, ... となり、その中で2番目に小さい数は「2」になります。解決手順以下の手順で問題を解くことができます。配列とkの値を初期化します。フラグ用の配列を用意し、与えられた配列に存在する要素以外をすべて0で初期化します。与
-
C++でK番目のブーム数を求めるアルゴリズムと実装方法
はじめにこのチュートリアルでは、C++を使って「k番目のブーム数」を見つけるプログラムを作成します。ブーム数とは、数字の2と3のみで構成される数のことです。たとえば、2、3、22、23、32、33、222などが該当します。アルゴリズムの手順この問題は、キュー(queue)を活用した幅優先探索(BFS)の考え方で効率よく解くことができます。具体的な手順は以下の通りです。変数kの値を初期化します。文字列型のキューを用意します。空文字列をキューに追加します。カウンター変数を0で初期化します。カウンターがkに達するまで、以下の処理を繰り返すループを作成します。キューの先頭要素を取得し、キューから取り出
-
【C++】最小ヒープからk番目に小さい要素を求める方法
このチュートリアルでは、最小ヒープ(min-heap)からk番目に小さい要素を求めるプログラムをC++で作成します。この問題は、優先度付きキュー(priority queue)を利用することで効率的に解くことができます。まずは、プログラムを完成させるまでの手順を確認していきましょう。最小ヒープを正しい値で初期化します。優先度付きキューを作成し、最小ヒープの根(ルート)ノードを挿入します。k − 1回繰り返すループを作成します。キューから最小の要素を取り出します(pop)。取り出したノードの左の子と右の子を優先度付きキューに追加します。ループ終了後、優先度付きキューの先頭にある要素がk番目に小さ
-
C++でソートされていない配列からK番目に小さい・大きい要素を求める方法
このチュートリアルでは、ソートされていない配列の中からk番目に小さい数値、およびk番目に大きい数値を見つけるプログラムをC++で作成する方法を解説します。 アルゴリズムの手順 問題を解くための基本的な流れは以下の通りです。 配列とkの値を初期化します。 sort関数を使って配列を昇順にソートします。 インデックス k - 1 の要素を返します。 サンプルコード:k番目に小さい要素 それでは、実際のコードを見てみましょう。 #include <bits/stdc++.h> using namespace std; int findKthSmallestNumber(int arr
-
C++のSTLを使って配列内のK番目に小さい・大きい要素を求める方法
はじめにこのチュートリアルでは、C++のSTL(標準テンプレートライブラリ)を使用して、ソートされていない配列からK番目に小さい要素を求めるプログラムを作成します。std::setを活用することで、手動でソートを行うことなく簡潔に実装できるのがポイントです。解決手順問題を解くための手順は以下の通りです。配列と値kを初期化する。空の順序付きセット(std::set)を初期化する。配列を走査し、各要素をセットに挿入する。セットの先頭からk-1回だけイテレータを進める。その位置の値を返す。std::setは要素を挿入した時点で自動的に昇順にソートされるため、先頭からk番目の要素にアクセスすれば、それ
-
【C++入門】カプレカー数かどうかを判定するプログラムの書き方
このチュートリアルでは、与えられた整数がカプレカー数(Kaprekar Number)であるかどうかを判定するプログラムをC++で作成します。 カプレカー数とは? カプレカー数とは、次のような性質を持つ特別な自然数です。 ある数 n を2乗する。 その2乗の値を右側から桁を分けて2つの部分に分割する。 分割した2つの数の合計が、元の数 n と一致すれば、その数はカプレカー数である。 例えば、45はカプレカー数です。45の2乗は2025であり、これを「20」と「25」に分割すると、20 + 25 = 45となり元の数に戻るからです。他にも、9(81 → 8 + 1 = 9)、297(8820
-
C++でキース数(Keith Number)を判定するプログラムの作成方法
はじめにこのチュートリアルでは、与えられた整数がキース数(Keith Number)であるかどうかを判定するプログラムをC++で作成します。キース数とは?キース数とは、その数自身の各桁の数字から生成される数列の中に、元の数が現れるような特別な数のことです。数列の最初の項は数nの各桁の数字とし、それ以降の項は直前のd項(dは桁数)の合計として再帰的に計算されます。例えば「14」の場合を見てみましょう。初期項は 1, 4 です。次の項は 1+4=5、続いて 4+5=9、そして 5+9=14 となります。数列の中に元の数「14」が現れたため、14はキース数です。アルゴリズムの手順判定対象となる数nを
-
C++で学ぶKleeのアルゴリズム:線分の和集合の長さを求める方法
このチュートリアルでは、数直線上にある複数の線分について、その和集合(ユニオン)の長さを求めるプログラムをC++で作成します。 各線分の始点と終点が与えられ、それらの線分がカバーする範囲全体の合計の長さを計算するのが目的です。この問題を効率的に解く手法として知られているのが、Kleeのアルゴリズム(Klees Algorithm)です。 それでは、問題を解くための手順を順番に見ていきましょう。 Kleeのアルゴリズムの手順 すべての線分の座標を配列に格納します。 線分配列の2倍のサイズを持つベクター points を用意します。 線分配列を走査します。 現在の線分の始点と false のペ
-
C++で二分木の対角走査におけるK番目のノードを求める方法
このチュートリアルでは、二分木(バイナリツリー)を対角走査した際の k番目のノード を見つけるプログラムをC++で作成します。 対角走査とは 対角走査では、あるノードから右の子へたどれる範囲を同じ「対角線」上のノードとしてグループ化し、左の子は次の対角線として後から処理します。これにより、木を左上から斜めに切り分けるように順番に訪問することができます。 解決手順 サンプルデータで二分木を初期化します。 k の値を設定します。 キューというデータ構造を使って、二分木を対角的に走査します。 各ノードを訪れるたびに k をデクリメントします。 k が 0 になった時点で、そのノードの値を返します
-
C++で配列内のK番目の奇数を見つける方法
このチュートリアルでは、与えられた配列の中からK番目の奇数を見つけるプログラムをC++で作成します。配列の走査と条件分岐の基本的な考え方を学べる、初心者向けの良い例題です。問題を解く手順以下の手順に従って問題を解いていきましょう。配列と値kを初期化します。配列を先頭から順に走査します。現在の要素が奇数であれば、kの値を1減らします。kが0になった時点で、その要素を結果として返します。配列全体を走査してもK番目の奇数が見つからない場合は、-1を返します。サンプルコードそれでは、実際のコードを見てみましょう。#include <bits/stdc++.h> using namespac
-
【C++】Nより大きいK番目の素数を求めるアルゴリズムと実装方法
はじめに このチュートリアルでは、C++を使って「与えられた数 n より大きい k 番目の素数」を求めるプログラムを作成します。たとえば n = 5、k = 23 の場合、5より大きい素数を小さい順に数えて23番目となる 101 が出力されます。 アルゴリズム この問題は、あらかじめ素数表を作成しておくことで効率的に解けます。手順は以下の通りです。 数 n を初期化します。 エラトステネスの篩を用いて、106(1,000,000)までのすべての素数を求め、bool型の配列に格納します。 n + 1 から 106 まで順に走査するループを作成します。 現在の数が素数であれば、カウンタ k
-
【C++】要素を挿入するたびにK番目に小さい要素を求める方法
はじめに このチュートリアルでは、要素を挿入するたびにK番目に小さい要素を求めるアルゴリズムを解説します。 この問題は、最小ヒープ(min-heap)を利用することで効率よく解決できます。それでは、プログラムを完成させるための手順を順番に見ていきましょう。 アルゴリズムの手順 ランダムなデータで配列を初期化します。 優先度付きキュー(priority queue)を初期化します。 最初の k - 1 個の段階では、まだ K 番目に小さい要素が存在しないため、「- 」のような任意の記号を出力しておきます。 k 番目から n 番目まで繰り返すループを作成します。 最小ヒープのルート(先頭要素)
-
C++でソートされていない配列からk番目に小さい・大きい要素を求める方法
このチュートリアルでは、ソートされていない配列の中からk番目に小さい数値を見つけるプログラムをC++で作成します。基本的な考え方を理解すれば、k番目に大きい要素を求める場合にもすぐに応用できます。 解決のアプローチ 最もシンプルで分かりやすい方法は、配列を一度ソートしてしまい、目的の位置にある要素を取り出すことです。手順は以下の通りです。 配列とkの値を初期化する。 sort関数を使って配列を昇順にソートする。 インデックス k - 1 の位置にある値を返す(配列は0始まりのため)。 それでは、実際のコードを見てみましょう。 サンプルコード #include <bits/stdc++