Cプログラミング
 Computer >> コンピューター >  >> プログラミング >> Cプログラミング

C言語で過剰数(Abundant Number)を判定する方法

過剰数(Abundant Number)とは?

過剰数(abundant number、excessive number とも呼ばれます)とは、数論における概念の一つで、「その数自身を除く約数(真の約数)の総和が、元の数よりも大きくなる自然数」を指します。

例として 12 を見てみましょう。12 の真の約数は 1, 2, 3, 4, 6 であり、その合計は 16 です。16 は 12 より大きいため、12 は過剰数だと言えます。

また、真の約数の総和と元の数との差は過剰度(abundance)と呼ばれます。上の例では 16 − 12 = 4 となるため、12 の過剰度は 4 です。

過剰数にはほかに 18, 20, 24, 30, 36, 40, 48 などが挙げられます。

過剰数の判定手順

  1. 対象の数のすべての約数を求める
  2. 約数の総和を計算する(自分自身は除く)
  3. 総和が元の数より大きければ過剰数、そうでなければ過剰数ではないと判定する

C言語で過剰数を判定するプログラム

以下は、C言語で 56 が過剰数かどうかを判定するサンプルコードです。約数は「i × (n / i) = n」というペアで現れる性質を利用しており、√n までループするだけで全約数の総和を効率的に求められるようにしています。

#include <stdio.h>
#include <math.h>

int main(void) {
    int n = 56;
    int sum = 0;

    for (int i = 1; i <= sqrt(n); i++) {
        if (n % i == 0) {
            sum += i;           /* 約数 i を加算 */
            if (n / i != i) {   /* 平方根の二重加算を防止 */
                sum += n / i;   /* 対となる約数を加算 */
            }
        }
    }

    sum -= n;   /* 自分自身を除き、真の約数の和にする */

    if (sum > n) {
        printf("%d は過剰数です\n", n);
    } else {
        printf("%d は過剰数ではありません\n", n);
    }
    return 0;
}

プログラムのポイント

  • 約数の効率的な探索:i を 1 から √n まで順に調べ、n % i == 0 なら i は約数です。このとき n / i も必ず約数になるため、両方を一度に加算します。
  • 重複の回避:n が平方数の場合、i と n / i が一致することがあります。同じ約数を二重に足さないよう条件分岐で制御しています。
  • 最終判定:ループ終了後の sum は「全約数の総和」になっているため、n 自身を引いて真の約数の和にします。これが n より大きければ過剰数と判定されます。

実行結果:

56 は過剰数です

56 の真の約数は 1, 2, 4, 7, 8, 14, 28 で、その総和は 64 になります。64 > 56 であるため、56 は過剰数と正しく判定されています。

  1. 【C++】アリコット数列の求め方と実装例をわかりやすく解説

    アリコット数列とは アリコット数列(Aliquot Sequence)は、特殊な性質をもった数列です。数列はある整数から始まり、次の項は直前の項の真の約数(その数自身を除く約数)の総和として定義されます。 具体的な例で確認してみましょう。 入力 : 8 出力 : 8 7 1 0 解説 : 8 の真の約数は 4, 2, 1。その和は 7 7 の真の約数は 1。その和は 1 1 の真の約数は存在しないため、その和は 0 完全数・友愛数・社交数との関係 アリコット数列は、以下の3種類の特別な数と深い関わりがあります。 完全数:数列の長さが1(自分自身に戻る)となる数。例:6

  2. Pythonでリスト内の各数値の桁の合計を求める方法

    リストに含まれる各数値の「桁の合計」を求めたい場合、シンプルなループ処理と str メソッドを組み合わせることで簡単に実現できます。 Pythonのリストは、整数・浮動小数点数・文字列など、異なるデータ型の値を混在させて格納できる柔軟なデータ構造です。また、str メソッドを使うと、任意の値を文字列型に変換できます。この性質を利用すると、数値を1桁ずつ取り出して合計を計算することが可能になります。 以下に、実際の実装例を示します。 サンプルコード my_list = [11, 23, 41, 62, 89, 0, 10] print(リストの内容:) print(my_list) my_re