C 言語の古典的なアルゴリズムの例 7: 完全な数

ここに画像の説明を挿入

1. 問題の説明

1.1. 完全数とは

完全数または完全数とも呼ばれる完全数は、特別な自然数です。
すべての真の因子 (つまり、それ自体以外の約数) の合計 (つまり、因子関数) は、それ自体に正確に等しくなります。
適切な約数の合計と正確に等しい場合、数値は「完全」であると言われます。
最初の完全数は 6、2 番目の完全数は 28、3 番目の完全数は 496、次の完全数は 8128、33550336 などです。

1.2. 完全数の定義

適切な約数の合計と正確に等しい場合、数値は「完全」であると言われます。和が自分自身に等しい自然数を完全数と呼び、完全数または完全数と呼びます。
たとえば、
最初の完全数は 6 で、それ自体の 6 を除いて、1、2、3、6 の約数があり、残りの 3 つの数が加算され、1+2+3=6 となります。
2 番目の完全数は 28 で、約数は 1、2、4、7、14、および 28 です。それ自体の 28 を除いて、残りの 5 つの数は合計され、1+2+4+7+14=28 になります。
3 番目の完全数は 496 で、約数は 1、2、4、8、16、31、62、124、248、および 496 です。それ自体の 496 を除いて、残りの 9 つの数は合計され、1+2+4 になります。 + 8+16+31+62+124+248=496.
次の完全数は 8128、33550336 などです。

1.3. この記事の問題の説明

この記事の最後にある
問題の説明は、
次の点に示されています

  1. 1 から 10000 までの完全数をすべて出力します。
  2. 完全数のすべての固有約数 (つまり、それ自体以外の約数) の合計は、それ自体に正確に等しくなります。
  3. 6 は完全数で、約数は 1、2、3、6 で、それ自体は 6 で、残りの 3 つの数を足すと 1+2+3=6 になります。

2. アルゴリズム例コンパイル環境

この記事の C 言語のクラシック アルゴリズムの例のコンパイル環境では、統合開発環境: Visual Studio 2019 を使用します。
ここに画像の説明を挿入

ここに画像の説明を挿入

Visual Studio 2019の公式サイトへのリンクは以下の通り

Visual Studio 2019 公式 Web サイトのリンク
ここに画像の説明を挿入

Visual Studio 2019 統合開発環境の特長は、

  1. Visual Studio 2019 は、既定で Live Share コード コラボレーション サービスをインストールします。
  2. ユーザーがコードをすばやく記述できるようにする新しいウェルカム ウィンドウ、改善された検索機能、一般的なパフォーマンスの改善。
  3. Visual Studio IntelliCode AI ヘルプ。
  4. より優れた Python 仮想化と Conda サポート。
  5. また、WinForms や WPF などを含む .NET Core 3.0 プロジェクトのサポート。

3. アルゴリズム例の実装プロセス

3.1、ヘッダーファイルを含む

次のようにヘッダー ファイル コードをインクルードします。

#pragma once

// 包含头文件
#include <stdio.h>
#include <stdlib.h>

  • 使用される C 言語ヘッダー ファイルには、最近のものも含まれます。

3.2. 変数の宣言

変数宣言コードは次のとおりです。

    // 声明变量
    int i, j, k; 
  • 変数 i、j、k が宣言されます。

3.3. for ループを使用して 1 ~ 10000 の完全な数を見つける

for ループを使用して、1 ~ 10000 の完全な数を見つけます。コードは次のとおりです。

	/// <summary>
    /// 使用for循环来求1-10000的完数
    /// </summary>
    /// <returns>无</returns>
    for (i = 1; i < 10000; i++)
    {
    
    
        
    }
  • for ループを使用して、1 から 10000 までの完全な数を見つけます。
  • 1 から 10000 までの完全数を見つける具体的な実装は、次の点に示されています。

3.4. 変数の代入

変数の割り当てコードは次のとおりです。

 	// 变量赋值, 保证每次循环时sum的初值为0
    int sum = 0;
  • 変数の割り当てにより、ループが実行されるたびに sum の初期値が 0 になります。
  • 変数の割り当ては、数値の解決を完了するために使用されます。
    ここに画像の説明を挿入

3.5. j が i の因数かどうかを判断する

j が i の因数であるかどうかを判断します。コードは次のとおりです。

		for (j = 1; j < i; j++)
        {
    
    
            /// <summary>
            /// // 判断j是否为i的因子
            /// </summary>
            /// <returns></returns>
            if (i % j == 0)    
            {
    
    
                sum += j;
            }
        }
  • j が i の因数かどうかを判断します。

3.6. 因子数の合計が元の数と等しいかどうかを判断する

因子数が元の数と等しいかどうかを判断するコードは次のとおりです。

		/// <summary>
        /// 判断因子数的和是否和原数相等
        /// </summary>
        /// <returns></returns>
        if (sum == i)
        {
    
    
            printf("%d 的因数是: ", i);

            for (k = 1; k < i; k++)
            {
    
    
                if (i % k == 0)
                {
    
    
                    printf("%d ", k);
                }
            }
            printf("\n");
        }
  • 因子数の合計が元の数と等しいかどうかを判断します。
  • 約数の合計が元の数と等しい場合、その数は完全です。
  • 因子数の合計が元の数と等しくない場合、その数は完全ではありません。

F5 を押してコンパイルすると、デバッグ結果は次のようになります。

ここに画像の説明を挿入

6 的因数是: 1 2 3
28 的因数是: 1 2 4 7 14
496 的因数是: 1 2 4 8 16 31 62 124 248
8128 的因数是: 1 2 4 8 16 32 64 127 254 508 1016 2032 4064

请按任意键继续. . .

  • 1から10000までの範囲に、全部で4つの完全数があることがわかります。
  • これらの完全数は
  • 6 の因数は次のとおりです。 1 2 3
  • 28 の因数は次のとおりです。 1 2 4 7 14
  • 496 の因数は次のとおりです。 1 2 4 8 16 31 62 124 248
  • 8128 の係数は次のとおりです。 1 2 4 8 16 32 64 127 254 508 1016 2032 4064

3.7. 1から10000までの完全数を求める関数の関数モジュール化

  • 関数記述の方法を使用して、1 ~ 10000 の範囲内で完全な数を見つけます。

1から10000までの完全数を計算するための関数モジュール化コードは次のとおりです。

3.7.1. 1から10000までの完全数を計算する関数の関数モジュール化のための関数宣言

/// <summary>
/// 求完数的函数声明
/// </summary>
void numberPerfect();
  • 数値を見つける関数を宣言します。

3.7.2. 1から10000までの完全数を計算する関数の関数モジュール化のための関数定義

1~10000以内の完全数の関数モジュール化の関数定義コードは以下の通りです。

/// <summary>
/// 求完数的函数定义
/// </summary>
void numberPerfect()
{
    
    
    // 声明变量
    int i, j, k;

    /// <summary>
    /// 使用for循环来求1-10000的完数
    /// </summary>
    /// <returns>无</returns>
    for (i = 1; i < 10000; i++)
    {
    
    
        // 变量赋值, 保证每次循环时sum的初值为0
        int sum = 0;

        for (j = 1; j < i; j++)
        {
    
    
            /// <summary>
            /// // 判断j是否为i的因子
            /// </summary>
            /// <returns></returns>
            if (i % j == 0)
            {
    
    
                sum += j;
            }
        }

        /// <summary>
        /// 判断因子数的和是否和原数相等
        /// </summary>
        /// <returns></returns>
        if (sum == i)
        {
    
    
            printf("%d 的因数是: ", i);

            for (k = 1; k < i; k++)
            {
    
    
                if (i % k == 0)
                {
    
    
                    printf("%d ", k);
                }
            }
            printf("\n");
        }
    }

    printf("\n");
}


  • 上記の関数定義に示されているように、上記のポイントの関数を関数本体に追加します。
  • 関数の機能が実現されます: 1-10000 内の完全な数を見つけます。
  • forループの使い方。
  • 1 から 10000 までの範囲で完全な数を見つけます。
  • まず自分自身の約数を求めます。
  • 因子数の合計がそれ自体に等しいかどうかを調べます。

3.7.3. メイン関数で関数 numberPerfect を呼び出して、1 ~ 10000 の範囲の完全数を計算する

main 関数では、1 ~ 10000 の完全数を計算する関数 numberPerfect が呼び出されます。コードは次のとおりです。

 	// 调用求完数的函数
    numberPerfect();

F5 を押してコンパイルすると、デバッグ結果は次のようになります。

ここに画像の説明を挿入

4. 古典的なアルゴリズムのサンプル プログラムの完全なコード

古典的なアルゴリズムのサンプル プログラムの完全なコードは次のとおりです。

4.1、main.h ファイル

#pragma once

// 包含头文件
#include <stdio.h>
#include <stdlib.h>


/// <summary>
/// 求完数的函数声明
/// </summary>
void numberPerfect();


4.2、main.c ファイル

#define _CRT_SECURE_NO_WARNINGS

#include "Main.h"

/// <summary>
/// 主函数
/// </summary>
/// <returns>返回0</returns>
int main()
{
    
    
    system("color 3E");

    // 调用求完数的函数
    numberPerfect();

    system("pause");
    return 0;
}

/// <summary>
/// 求完数的函数定义
/// </summary>
void numberPerfect()
{
    
    
    // 声明变量
    int i, j, k;

    /// <summary>
    /// 使用for循环来求1-10000的完数
    /// </summary>
    /// <returns>无</returns>
    for (i = 1; i < 10000; i++)
    {
    
    
        // 变量赋值, 保证每次循环时sum的初值为0
        int sum = 0;

        for (j = 1; j < i; j++)
        {
    
    
            /// <summary>
            /// // 判断j是否为i的因子
            /// </summary>
            /// <returns></returns>
            if (i % j == 0)
            {
    
    
                sum += j;
            }
        }

        /// <summary>
        /// 判断因子数的和是否和原数相等
        /// </summary>
        /// <returns></returns>
        if (sum == i)
        {
    
    
            printf("%d 的因数是: ", i);

            for (k = 1; k < i; k++)
            {
    
    
                if (i % k == 0)
                {
    
    
                    printf("%d ", k);
                }
            }
            printf("\n");
        }
    }

    printf("\n");
}





V. まとめ

この記事の C 言語の古典的なアルゴリズムの例: Wanshu、達成する目標は次のとおりです。

  1. 1 から 10000 までの完全数をすべて出力します。
  2. 完全数のすべての固有約数 (つまり、それ自体以外の約数) の合計は、それ自体に正確に等しくなります。
  3. 6 は完全数で、約数は 1、2、3、6 で、それ自体は 6 で、残りの 3 つの数を足すと 1+2+3=6 になります。

ここに画像の説明を挿入

記事はここまでです。
この記事の C 言語の古典的なアルゴリズムの例: 完全な数であることを願っています。
C 言語とアルゴリズムの学習への愛を刺激することができます。

  • あなたのサポートは私の最大の励ましです。

おすすめ

転載: blog.csdn.net/m0_47419053/article/details/126869337