C言語

【C言語】「完全数」の判定 / 表示を行う


プログラミング初心者向けの練習問題として以下のようなものがあります。

  • 対象の数字が完全数か否かを判定する
  • 指定した範囲内の完全数の一覧を表示する

本記事では、これら処理を実装する方法について説明します。

そもそも「完全数」とは?

まずは完全数とは何かについて簡単に説明します。

完全数の定義

完全数とは、正の約数(自分自身を除く)の和が自分自身と一致する自然数のことです。

完全数の例をいくつか示します。

6, 28, 496, 8128, 33550336, 8589869056 …

28の約数は1、2、4、7、14であり、これらをすべて足すと28になるため、28は完全数であるとわかります。

完全数の求め方

現状、完全数を求めるための完璧な方程式は発見されていません。(※方程式自体は発見されているが、様々な制約がある)

そのため、完全数を求めるための現実的な手段は対象の数が自分自身の約数の和と一致するか否かをその都度調べることです。

①「完全数の判定プログラム」を作成する

ここでは「対象の数字が完全数か否かを判定する」プログラムを作成します。

プログラム作成の手順

プログラム作成の手順は以下の通りです。

  1. 判定対象となる数(N)を入力させる
  2. NとNの約数の和が一致するか調べる
  3. 2の真偽によってNが完全数か否かを判定する

実装例

上記の手順に従ってプログラムを作成します。

#include <stdio.h>

int main(void) {

  /* 変数を定義する */
  int number, i, sum;

  /* 数値の入力を促すメッセージを表示 */
  printf("Enter a number : \n");
  scanf("%d", &number);
  printf("\n");

  /* 入力した数とその約数の和が一致するか調べる */
  sum = 0;
  for(i=1; i<number; i++){
    if(number%i==0){
      sum += i;
    }
  }

  if(number==sum){
    printf("%d is a perfect number.\n", number);
  }else{
    printf("%d is NOT a perfect number.\n", number);
  }

  return 0;
}

このプログラムを実行すると以下の出力結果が得られます。

Enter a number : 
6

6 is a perfect number.

…

Enter a number : 
7

7 is NOT a perfect number.

②「完全数の表示プログラム」を作成する

ここでは「指定した範囲内の完全数の一覧を表示する」プログラムを作成します。

プログラム作成の手順

プログラム作成の手順は以下の通りです。

  1. 任意の数(N)を入力させる
  2. 1~Nの範囲内の数とその数の約数の和が一致するかを順に調べる
  3. 2の真偽によって完全数と判定した数のみ表示する

実装例

このプログラムを実行すると以下の出力結果が得られます。

#include <stdio.h>

int main(void) {

  /* 変数を定義する */
  int number, i, j, sum;

  /* 数値の入力を促すメッセージを表示 */
  printf("Enter a number : \n");
  scanf("%d", &number);
  printf("\n");

  /* 指定した範囲内の数とその約数の和が一致するかを順に調べる */
  for(i=1; i<number; i++){
    sum = 0;
    for(j=1; j<i; j++){
      if(i%j==0){
        sum += j;
      }
    }
    if(i==sum){
      printf("%d, ", i);
    }
  }

  return 0;
}

このプログラムを実行すると以下の出力結果が得られます。

Enter a number : 
1000

6, 28, 496,