C++で順列の推測に必要な移動回数を求めるアルゴリズム
整数 N が与えられたとき、順列(permutation)を最悪ケースで完全に推測し切るまでに必要な移動回数を求める問題を考えます。この移動回数は単純な階乗ではなく、「1 から N までの各 i に対して i × (N − i) を計算して合計し、最後に N を加える」ことで求められます。
具体例
入力
9
出力
129
N = 9 の場合、i = 1 のときは 1 × 8 = 8、i = 2 のときは 2 × 7 = 14、i = 3 のときは 3 × 6 = 18 … というように計算を進めていきます。これらをすべて合計すると 120 になり、さらに N の値である 9 を加えると、答えは 129 となります。
アルゴリズム
- 整数 n を受け取る。
- カウント用変数 count を 0 で初期化する。
- i を 1 から n までループさせる。
- count に i × (n − i) を加算する。
- ループ終了後、count に n を加算する。
- count を結果として返す。
C++での実装
以下は、上記のアルゴリズムを C++ で実装した例です。
#include <bits/stdc++.h>
using namespace std;
int getNumberMoves(int n) {
int count = 0;
for (int i = 1; i <= n; i++) {
count += i * (n - i);
}
count += n;
return count;
}
int main() {
int n = 9;
cout << getNumberMoves(n) << endl;
return 0;
}
実行結果
上記のコードを実行すると、次の出力が得られます。
129
計算量
このアルゴリズムは 1 から n までを一度だけ走査するため、時間計算量は O(n)、追加のメモリをほとんど使わず空間計算量は O(1) で動作します。大きな n に対しても効率的に処理できるのが特徴です。
-
【C++】長方形に含まれる正方形の総数を求めるアルゴリズムと実装
縦の長さL、横の幅B(L≥B)の長方形が与えられたとします。この記事では、L×Bの長方形の中にいくつの正方形が含まれているかを効率的に求める方法を解説します。 上の図は3×2の長方形の例です。この長方形には、2×2の正方形が2個、1×1の正方形が6個含まれています。 合計:6+2=8個 規則性を見つける まず、正方形だけで構成されたB×Bの図形について考えてみましょう。 サイズL×Bの長方形には、必ずL×B個の1×1の正方形が含まれます。 含まれる最大の正方形のサイズはB×Bです。 L=B=1の場合:正方形の数=1 L=B=2の場合:正方形の数=1+4=5(2×2が1個、1×1が4個) L
-
C++で数値Nを25で割り切れるようにするための最小移動回数を求める方法
問題の概要 先頭にゼロが付かない数値 N が与えられます。この問題の目的は、N を 25 で割り切れるようにするために必要な移動(隣り合う 2 桁の入れ替え)の最小回数を求めることです。ただし、どの時点においても数値の先頭がゼロになってはいけません。どのように操作しても N を 25 の倍数にできない場合は、-1 を出力します。 例えば、N = 5071 の場合、25 で割り切れる状態にするには 4 回の移動が必要です。 5071 → 5701 → 7501 → 7510 → 7150 ポイント:25 の倍数の性質 ある整数が 25 で割り切れるのは、そ