C++でn本の直線が作る最大交点数を求める方法
はじめに
この記事では、n本の直線が作りうる最大の交点数を求めるプログラムをC++で実装する方法を解説します。
問題設定はシンプルです。直線の本数nが与えられたとき、それらの直線が交わりうる交点の最大数を計算します。
考え方
交点数を最大化するためには、以下の条件が必要です。
- どの2本の直線も平行ではない
- 3本以上の直線が同一の点で交わらない
この条件下では、交点は「n本の直線から2本を選ぶ組み合わせ」ごとに1つずつ生まれます。したがって、最大交点数は次の公式で表されます。
最大交点数 = n × (n − 1) / 2
実装例
#include <bits/stdc++.h>
using namespace std;
#define ll long int
// 最大交点数を求める関数
ll countMaxIntersect(ll n) {
return (n) * (n - 1) / 2;
}
int main() {
ll n = 8;
cout << countMaxIntersect(n) << endl;
return 0;
}
出力
28
コードの解説
関数 countMaxIntersect は、公式 n × (n − 1) / 2 をそのまま実装したものです。n = 8 の場合、8 × 7 ÷ 2 = 28 となり、出力は28になります。
2で割る理由は、直線Aと直線Bの交点と、直線Bと直線Aの交点が同じものであるため、重複を避けるためです。この計算量はO(1)であり、非常に効率的です。
-
C++で2つの連結リストの交点を見つける方法
連結リストとは連結リスト(Linked List)は線形データ構造の一種です。各ノードは2つの部分で構成されており、一方にはノードの値(データ)が、もう一方には次のノードへのアドレス(ポインタ)が格納されています。ここでは、各ノードがリスト内の他のノードを指すポインタを持つ連結リストを想定します。この問題のタスクは、2つの連結リストが交差するノードを見つけることです。交差していない場合は、NULL(空)を出力として返します。入力例1出力:2解説: 与えられた連結リストは値「2」のノードで交差しているため、「2」を出力として返します。入力例2出力:NULL解説: 共通するノードが存在しないため、
-
C++で2本の直線の交点を求めるプログラムの書き方
直線ABを定義する2点A・Bと、直線CDを定義する2点C・Dが与えられたとき、この2つの直線の交点を求めるのが課題です。 注意 − すべての点は、X座標とY座標を持つ2次元平面上にあるものとします。 図では、A(a1, a2)とB(b1, b2)を通る直線、C(c1, c2)とD(d1, d2)を通る直線という、互いに異なる2つの直線が描かれており、P(p1, p2)がその交点を表しています。 交点の求め方 まず、2点を通る直線を「ax + by = c」の形の方程式で表します。各点の座標を使って、次のように係数を計算します。 A1 = b2 - a2 B1 = a1 - b1 C1 =