C++でチェス盤に含まれる正方形の総数を求めるプログラム
この記事では、チェス盤のサイズ n が与えられたとき、その盤面に含まれるすべての正方形の総数をC++で求めるプログラムを解説します。
問題の概要
チェス盤に含まれる正方形の数を求めるには、盤面の内部に存在する正方形をすべてのサイズについて数える必要があります。具体的には、1×1、2×2、3×3 … n×n のように、各サイズごとの正方形の組み合わせをすべて合計します。
具体例
入力: n = 4

出力: 30
1×1 の正方形 → 16 個 2×2 の正方形 → 9 個 3×3 の正方形 → 4 個 4×4 の正方形 → 1 個 正方形の総数 = 16 + 9 + 4 + 1 = 30
なお、標準的な8×8のチェス盤の場合、この計算式により204個の正方形が存在することになります。
解法アプローチ:二乗和の公式を利用する
各サイズ k の正方形の数は (n − k + 1)2 個になります。したがって、総数は1から n までの平方数の和として表せます。
sum(1) = 1 sum(2) = 1 + 4 = 5 sum(3) = 1 + 4 + 9 = 14 sum(4) = 1 + 4 + 9 + 16 = 30
この規則性を一般化すると、次の有名な二乗和の公式が得られます。
sum = 1² + 2² + 3² + 4² + … + n² sum = n × (n + 1) × (2n + 1) / 6
この公式を使えば、ループで毎回足し合わせることなく、O(1) の定数時間で答えを計算できます。
C++での実装例
#include <iostream>
using namespace std;
int calcSquaresCount(int n){
int squareCount = ((n * (n + 1) * (2 * n + 1)) / 6);
return squareCount;
}
int main() {
int n = 6;
cout << "サイズ " << n << "×" << n << " の盤面に含まれる正方形の総数は "
<< calcSquaresCount(n);
return 0;
}
実行結果
サイズ 6×6 の盤面に含まれる正方形の総数は 91
まとめ
n×n のチェス盤に含まれる正方形の総数は、二乗和の公式 n(n+1)(2n+1)/6 を使うことで簡単かつ効率的に求められます。計算量は O(1)、空間計算量も O(1) であり、非常に効率的な解法です。ただし、大きな n を扱う場合はオーバーフローに注意し、必要に応じて long long 型などのより大きな整数型を使用することをおすすめします。
-
C++で最小公倍数(LCM)を求めるプログラム:初心者向けに2つの方法を解説
最小公倍数(LCM: Least Common Multiple)とは、2つの整数に共通する倍数の中で最も小さい数のことです。プログラミングの基礎的なアルゴリズム学習においても頻出のテーマであり、C++を使えば簡単に求めることができます。最小公倍数とは?具体例で確認例として、15と9という2つの数を考えてみましょう。それぞれ素因数分解すると次のようになります。15 = 5 × 3 9 = 3 × 3この場合、15と9の両方を割り切れる最小の数、つまり最小公倍数は 45 となります。方法1:大きい方の数から順に増やしていく方法まず紹介するのは、最も直感的なアプローチです。2つの数のうち大きい方
-
C++で2つの数の最大公約数(GCD)を求めるプログラム
最大公約数(GCD)とは最大公約数(GCD: Greatest Common Divisor)とは、2つの整数をどちらも割り切る正の整数のうち、最も大きい数のことです。プログラミングの基礎的なアルゴリズム問題としてよく取り上げられるテーマであり、分数の約分や暗号処理など、さまざまな場面で活用されます。例として、45と27という2つの数を考えてみましょう。45 = 5 × 3 × 327 = 3 × 3 × 3両方の数に共通する素因数は「3 × 3」であるため、45と27の最大公約数は9となります。方法1:ユークリッドの互除法による実装2つの数の最大公約数を求める最も効率的な方法が「ユークリッド