【C++】n²の約数のうち、nの約数ではないものを数える方法
このチュートリアルでは、n²(nの2乗)の約数のうち、n自体の約数ではないものの個数を求めるプログラムをC++で作成します。一見難しそうに思えますが、アルゴリズムは非常にシンプルです。解決までの手順を順番に見ていきましょう。
アルゴリズム
- 数値 n を初期化します。
- 約数を数えるためのカウンターを初期化します。
- 2 から n² までの各整数について、次の条件を判定します。
- n² がその数値で割り切れ、かつ n がその数値で割り切れない場合は、カウントを1つ増やします。
- 最終的なカウントを出力します。
実装例
それでは、実際のコードを見てみましょう。
#include <bits/stdc++.h>
using namespace std;
int getNumberOfDivisors(int n) {
int n_square = n * n;
int divisors_count = 0;
for (int i = 2; i <= n_square; i++) {
if (n_square % i == 0 && n % i != 0) {
divisors_count++;
}
}
return divisors_count;
}
int main() {
int n = 6;
cout << getNumberOfDivisors(n) << endl;
return 0;
}
出力
上記のプログラムを実行すると、次の結果が表示されます。
5
結果の解説
n = 6 の場合、n² = 36 となり、その約数は「1, 2, 3, 4, 6, 9, 12, 18, 36」です。一方、n = 6 の約数は「1, 2, 3, 6」です。したがって、36 の約数のうち 6 の約数ではないものは「4, 9, 12, 18, 36」の 5 個となり、出力結果と一致します。
計算量について
この実装では 2 から n² までのすべての整数を走査するため、時間計算量は O(n²) になります。n が大きくなるほど処理に時間がかかるため、大きな数値を扱う場合は注意が必要です。
まとめ
本記事では、n² の約数のうち n の約数ではないものの個数を求める C++ プログラムを紹介しました。剰余演算(%)と条件分岐を組み合わせるだけで、誰でも簡単に実装できることがわかりました。本チュートリアルについて質問がある場合は、ぜひコメント欄でお知らせください。
-
C++で3つの点が同一直線上にあるかどうかを判定するプログラム
3つの異なる座標を持つ点が与えられ、それらの点が同一直線上に並んでいるかどうか(共線性・コリニア)を判定するのが本記事のテーマです。3つの点がすべて同じ直線上に乗っている場合、これらの点は「共線(collinear)」であるといいます。逆に、異なる直線上に配置されている場合は共線ではありません。以下の図は、共線な点と共線でない点の違いを示したものです。入力例と出力例入力1x1 = 1, x2 = 2, x3 = 3, y1 = 1, y2 = 4, y3 = 5出力1no points are not collinear入力2x1 = 1, y1 = 1, x2 = 1, y2 = 4, x3
-
3D空間上の4点が同一平面上にあるかどうかを判定するC++プログラム
共平面(コプラナー)とは3次元空間において、4つの点 (x1, y1, z1)、(x2, y2, z2)、(x3, y3, z3)、(x4, y4, z4) が与えられたとき、これらの点がすべて同一の平面上に存在するかどうかを判定する問題を考えます。すべての点が同じ平面上に乗っている場合、その点たちは「共平面(コプラナー)」であるといいます。逆に、点が異なる複数の平面にまたがっている場合は、共平面ではありません。下図は、4つの点がすべてxy平面上に存在する例です。この場合、点たちは共平面であるといえます。一方、下図のように4つの点がそれぞれ異なる平面上に存在する場合、点たちは共平面ではありませ