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 から 10000 までの完全数をすべて出力します。
- 完全数のすべての固有約数 (つまり、それ自体以外の約数) の合計は、それ自体に正確に等しくなります。
- 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 統合開発環境の特長は、
- Visual Studio 2019 は、既定で Live Share コード コラボレーション サービスをインストールします。
- ユーザーがコードをすばやく記述できるようにする新しいウェルカム ウィンドウ、改善された検索機能、一般的なパフォーマンスの改善。
- Visual Studio IntelliCode AI ヘルプ。
- より優れた Python 仮想化と Conda サポート。
- また、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 から 10000 までの完全数をすべて出力します。
- 完全数のすべての固有約数 (つまり、それ自体以外の約数) の合計は、それ自体に正確に等しくなります。
- 6 は完全数で、約数は 1、2、3、6 で、それ自体は 6 で、残りの 3 つの数を足すと 1+2+3=6 になります。
記事はここまでです。
この記事の C 言語の古典的なアルゴリズムの例: 完全な数であることを願っています。
C 言語とアルゴリズムの学習への愛を刺激することができます。
- あなたのサポートは私の最大の励ましです。