その他のアルゴリズム問題まとめ:分類外の定番トピック一覧
その他のアルゴリズム問題の概要
これまでの各セクションでは、カテゴリごとにさまざまなアルゴリズム問題を取り上げてきました。しかし、特定のジャンルに分類しづらい問題も数多く存在します。このセクションでは、そうした「その他」の問題の中から、実践的で学習価値の高いものをピックアップして紹介します。
扱うテーマは、数論・幾何学・文字列処理・乱択アルゴリズムなど多岐にわたります。いずれも競技プログラミングや技術面接、実際のシステム開発でも頻出する内容ばかりです。
このセクションで扱う問題一覧
- n進数同士の加算
- バビロニア法による平方根の計算
- 巨大な数の階乗計算
- 点が多角形の内部にあるかどうかの判定
- 完全平方数かどうかの判定
- 4つの点が正方形をなすかどうかの判定
- 2つの集合が互いに素(共通要素なし)かどうかの判定
- 2つの線分が交差しているかどうかの判定
- 点が三角形の内部にあるかどうかの判定
- 最小コストで n 本のロープを連結する問題
- 数値からローマ数字への変換
- ちょうど k 辺で始点から終点へ到達できる経路の数え上げ
- 2つの数を高速に乗算する方法
- 数値を英語表記(ワード)に変換
- フラッドフィル(領域塗りつぶし)アルゴリズム
- 素数の和で表される偶数の検証
- グレアムスキャン法(凸包計算)
- ジャービスマーチ法(ギフト包装法)
- 配列内の k 番目に大きい要素の探索
- 辞書順で最小になる文字列の回転
- ハッシュマップを用いた「鍵と錠前」マッチング問題
- ナッツ・アンド・ボルト問題
- 文字列のすべての順列を出力
- 数値のパリティ(偶奇)チェック
- リザーバーサンプリング(貯水池抽出法)
- 巡回セールスマン問題(TSP)
- ツェラーの公式による曜日の計算
- 英数字混在の文字列を自然順にソート
- ハノイの塔問題
- 魔方陣の生成と検証
- 配列の要素をシャッフルする
- 行列を螺旋状(スパイラル)に出力する
学習のポイント
これらの問題は、個別の暗記よりも「どのデータ構造・アルゴリズムが有効かを見抜く力」を養うのに適しています。たとえば幾何学系の問題では外積の活用、探索系の問題ではハッシュマップや二分探索の使いどころ、乱択系ではリザーバーサンプリングのような確率的手法が鍵となります。まずは各問題を自分の手で解いてみて、その後に最適化のアイデアを考察すると理解が深まるでしょう。
-
C++で数値が別の数値の累乗であるかどうかを判定する方法
この記事では、ある数値が別の数値の累乗として表せるかどうかを判定する方法を解説します。例えば、125 と 5 という2つの数値が与えられた場合、125 が 5 の累乗であれば true を返します。実際、125 = 53 なので、この場合は true となります。判定の考え方はシンプルです。基数 x の累乗値を順番に計算していき、目的の数値 y に一致するかどうかを確認します。一致すれば「表せる」、y を超えてしまえば「表せない」と判断できます。アルゴリズム手順は以下の擬似コードの通りです。特別なケースとして、x が 1 の場合は y も 1 のときのみ true を返します(1 の累乗は常に
-
C#で数値が2の累乗かどうかを判定する方法をわかりやすく解説
「2の累乗」とは、整数 n を用いて 2n の形で表せる数のことです。つまり、基数を2、指数を整数 n としてべき乗計算を行った結果の値を指します。代表的な2の累乗は以下の表のとおりです。n2n01122438416532このように、n = 0 のときは 20 = 1 となる点に注意してください。1 もまた2の累乗に含まれます。C#で数値が2の累乗かどうかを判定するには、主に2つのアプローチがあります。それぞれサンプルコードとともに見ていきましょう。方法1:ビット演算を使う(高速・定番)2の累乗である数をバイナリで表すと、最上位ビットだけが1になり、それ以外はすべて0になります。例えば、8 は