JavaScriptで指定された周囲長を持つすべての直角三角形を求める方法
問題
数値を1つ受け取り、その値を周囲長(3辺の長さの合計)とするすべての直角三角形の辺の組み合わせを、配列として返すJavaScript関数を作成します。
直角三角形の成立条件
3辺を a・b・c(c を最も長い辺=斜辺とする)としたとき、直角三角形であるためにはピタゴラスの定理「a² + b² = c²」を満たす必要があります。加えて、「a + b + c = 指定された周囲長」という条件も同時に成立しなければなりません。
コード例
以下が実際のコードです。
const perimeter = 120;
const findAllRightTriangles = (perimeter = 1) => {
const res = [];
// 最短の辺aは、周囲長の1/3を超えることはない
for(let a = 1; a <= Math.floor(perimeter / 3); a++){
// 辺bはaより大きく、残りの2辺の合計の半分未満で探索
for(let b = a + 1; b < (perimeter - a) / 2; b++){
// 3本目の辺cは「周囲長 - a - b」で自動的に求まる
const c = perimeter - a - b;
// ピタゴラスの定理で直角三角形かどうかを判定
if(a * a + b * b === c * c){
res.push([a, b, c]);
}
}
}
return res;
};
console.log(findAllRightTriangles(perimeter));
出力
コンソールには次の結果が出力されます。
[ [ 20, 48, 52 ], [ 24, 45, 51 ], [ 30, 40, 50 ] ]
解説
このアルゴリズムでは、2つの辺(a と b)をループで探索し、3本目の辺 c は「c = 周囲長 − a − b」として自動的に導きます。これにより、3重ループを使わずにすべての組み合わせを網羅できます。
さらに、探索範囲を以下のように絞ることで、計算量を大幅に削減しています。
- 最短の辺 a は、3辺の中で最も短いため「周囲長 ÷ 3」以下に収まります。
- 辺 b は a より大きく、c 未満となるため「(周囲長 − a) ÷ 2」まで調べれば十分です。
あとは各組み合わせに対してピタゴラスの定理が成立するかを確認するだけでよいため、周囲長が大きくなっても高速に動作するのが特徴です。
-
JavaScriptで長方形内に埋め込まれた正方形の周囲長の合計を求める方法
問題 下図のように、1つの長方形の中に正方形が5つ埋め込まれている状況を考えてみましょう。 このとき、それぞれの正方形の周囲長は次のようになります。 4 + 4 + 8 + 12 + 20 = 48 単位 一見すると複雑な計算が必要そうに思えますが、よく観察すると各正方形の一辺の長さがフィボナッチ数列(1, 1, 2, 3, 5, ...)に従っていることが分かります。つまり、n個の正方形が埋め込まれている場合、周囲長の合計は「最初のn項のフィボナッチ数の総和 × 4」で求められるのです。 そこで本記事では、数値 n を引数として受け取り、n個の正方形が埋め込まれた場合の周囲長の合計を返す
-
C++で指定した周囲長から作れる直角三角形の個数を数える方法
三角形の周囲長 P が与えられたとき、同じ周囲長を持つ直角三角形が何通り作れるかを求めるのが本記事の目的です。なお、周囲長とは三角形の3辺の長さをすべて足し合わせた合計値のことです。 三角形の辺を a、b、c とすると、求めたい直角三角形は次の2つの条件を満たす必要があります。 周囲長の条件: a + b + c = P ピタゴラスの定理: a2 + b2 = c2(a、b、c のいずれの組み合わせに対しても成立) 探索は、a を 1 から p/2 まで、b を a+1 から p/3 まで変化させながら行い、c = p − a − b(a + b + c = p から導かれます)として求め