【C言語】約数を大きい順に表示していくプログラムの書き方を解説

C言語を使って、ある整数の約数を大きい順に表示するプログラムを作成する方法を学びます。

この記事では、プログラムの設計から実際のコードの実装まで、ステップバイステップで解説します。

プログラムの設計では、必要な変数やデータ構造、アルゴリズムの概要について説明し、コードの実装では、各関数の詳細な実装方法を紹介します。

目次から探す

プログラムの設計

C言語で約数を大きい順に表示するプログラムを作成するためには、まずプログラムの設計をしっかりと行うことが重要です。

ここでは、必要な変数とデータ構造、そしてアルゴリズムの概要について説明します。

必要な変数とデータ構造

約数を計算し、それを大きい順にソートして表示するためには、以下のような変数とデータ構造が必要です。

  1. 入力値を格納する変数: ユーザーから入力された整数を格納するための変数が必要です。

例えば、int number;という変数を用意します。

  1. 約数を格納する配列: 約数を一時的に格納するための配列が必要です。

例えば、int divisors[100];のように配列を用意します。

配列のサイズは適宜調整してください。

  1. 約数の個数をカウントする変数: 約数の個数をカウントするための変数が必要です。

例えば、int count = 0;という変数を用意します。

アルゴリズムの概要

プログラムのアルゴリズムは大きく分けて以下の3つのステップに分かれます。

  1. 約数の計算
  2. 約数のソート
  3. 約数の表示

約数の計算方法

約数を計算するためには、1から入力された整数までの範囲で、その整数を割り切れる数を見つける必要があります。

具体的には、以下のような手順で行います。

  1. 1から入力された整数までの範囲でループを回します。
  2. 各ループの中で、入力された整数を現在のループカウンタで割り、その余りが0であれば、その数は約数です。
  3. 約数を見つけたら、それを配列に格納し、カウントを増やします。

例えば、入力値が12の場合、1から12までの数で12を割り切れる数(1, 2, 3, 4, 6, 12)を見つけます。

約数のソート方法

約数を大きい順に表示するためには、計算した約数をソートする必要があります。

ここでは、バブルソートを用いてソートを行います。

バブルソートの手順は以下の通りです。

  1. 配列の要素を隣り合う要素と比較し、大きい方を前に持ってくる。
  2. これを配列の最後まで繰り返し、1回のループが終わるごとに最大の要素が最後に確定する。
  3. この操作を配列の要素数-1回繰り返す。

例えば、配列が[1, 2, 3, 4, 6, 12]の場合、バブルソートを適用すると[12, 6, 4, 3, 2, 1]となります。

以上がプログラムの設計における必要な変数とデータ構造、そしてアルゴリズムの概要です。

次の項では、これらの設計に基づいて実際のコードを実装していきます。

コードの実装

ここからは、実際にC言語で約数を大きい順に表示するプログラムを実装していきます。

各ステップごとに詳細な解説を行いますので、順を追って理解していきましょう。

ヘッダファイルのインクルード

まずは、必要なヘッダファイルをインクルードします。

標準入出力を行うためのstdio.hと、動的メモリ確保のためのstdlib.hを使用します。

#include <stdio.h>
#include <stdlib.h>

メイン関数の定義

次に、メイン関数を定義します。

ここでは、ユーザーから入力を受け取り、約数を計算し、ソートして表示する一連の流れを実行します。

int main() {
    int number;
    printf("整数を入力してください: ");
    scanf("%d", &number);
    // 約数を計算する関数を呼び出す
    int* divisors = calculateDivisors(number, &divisorCount);
    // 約数をソートする関数を呼び出す
    sortDivisors(divisors, divisorCount);
    // 約数を表示する関数を呼び出す
    printDivisors(divisors, divisorCount);
    // 動的に確保したメモリを解放する
    free(divisors);
    return 0;
}

約数を計算する関数の実装

関数のプロトタイプ宣言

まず、約数を計算する関数のプロトタイプ宣言を行います。

この関数は、整数を引数として受け取り、その整数の約数を配列として返します。

また、約数の個数を返すためのポインタも引数として受け取ります。

int* calculateDivisors(int number, int* count);

関数の詳細な実装

次に、約数を計算する関数の詳細な実装を行います。

この関数では、動的にメモリを確保し、約数を配列に格納します。

int* calculateDivisors(int number, int* count) {
    int* divisors = (int*)malloc(number * sizeof(int));
    *count = 0;
    for (int i = 1; i <= number; i++) {
        if (number % i == 0) {
            divisors[*count] = i;
            (*count)++;
        }
    }
    return divisors;
}

約数をソートする関数の実装

関数のプロトタイプ宣言

次に、約数をソートする関数のプロトタイプ宣言を行います。

この関数は、約数の配列とその個数を引数として受け取り、配列を大きい順にソートします。

void sortDivisors(int* divisors, int count);

関数の詳細な実装

次に、約数をソートする関数の詳細な実装を行います。

ここでは、バブルソートを用いて配列を大きい順にソートします。

void sortDivisors(int* divisors, int count) {
    for (int i = 0; i < count - 1; i++) {
        for (int j = 0; j < count - i - 1; j++) {
            if (divisors[j] < divisors[j + 1]) {
                int temp = divisors[j];
                divisors[j] = divisors[j + 1];
                divisors[j + 1] = temp;
            }
        }
    }
}

約数を表示する関数の実装

関数のプロトタイプ宣言

次に、約数を表示する関数のプロトタイプ宣言を行います。

この関数は、約数の配列とその個数を引数として受け取り、約数を表示します。

void printDivisors(int* divisors, int count);

関数の詳細な実装

次に、約数を表示する関数の詳細な実装を行います。

この関数では、配列の要素を順に表示します。

void printDivisors(int* divisors, int count) {
    printf("約数を大きい順に表示します: ");
    for (int i = 0; i < count; i++) {
        printf("%d ", divisors[i]);
    }
    printf("\n");
}

完成したコード

以上の実装をまとめると、以下のような完成したコードになります。

#include <stdio.h>
#include <stdlib.h>
// 関数のプロトタイプ宣言
int* calculateDivisors(int number, int* count);
void sortDivisors(int* divisors, int count);
void printDivisors(int* divisors, int count);
int main() {
    int number;
    printf("整数を入力してください: ");
    scanf("%d", &number);
    int divisorCount;
    // 約数を計算する関数を呼び出す
    int* divisors = calculateDivisors(number, &divisorCount);
    // 約数をソートする関数を呼び出す
    sortDivisors(divisors, divisorCount);
    // 約数を表示する関数を呼び出す
    printDivisors(divisors, divisorCount);
    // 動的に確保したメモリを解放する
    free(divisors);
    return 0;
}
int* calculateDivisors(int number, int* count) {
    int* divisors = (int*)malloc(number * sizeof(int));
    *count = 0;
    for (int i = 1; i <= number; i++) {
        if (number % i == 0) {
            divisors[*count] = i;
            (*count)++;
        }
    }
    return divisors;
}
void sortDivisors(int* divisors, int count) {
    for (int i = 0; i < count - 1; i++) {
        for (int j = 0; j < count - i - 1; j++) {
            if (divisors[j] < divisors[j + 1]) {
                int temp = divisors[j];
                divisors[j] = divisors[j + 1];
                divisors[j + 1] = temp;
            }
        }
    }
}
void printDivisors(int* divisors, int count) {
    printf("約数を大きい順に表示します: ");
    for (int i = 0; i < count; i++) {
        printf("%d ", divisors[i]);
    }
    printf("\n");
}

このプログラムを実行すると、ユーザーが入力した整数の約数が大きい順に表示されます。

例えば、36を入力した場合、出力は以下のようになります。

整数を入力してください: 36
約数を大きい順に表示します: 36 18 12 9 6 4 3 2 1

これで、C言語を用いて約数を大きい順に表示するプログラムの実装が完了しました。

各関数の役割と実装方法を理解することで、他の問題にも応用できるようになるでしょう。

目次から探す