C プログラミング (C Programming)

[2017/11/04, H.Aman]
[← 演習のページへ戻る]

サンプルプログラム 4 の内容

自然数 n を読み込み,1 ~ n についてそれぞれの約数を表示する.
 1:   #include <stdio.h>
 2:  	
 3:   int main(void){
 4:      int n, i, k;
 5: 
 6:      printf("n を一つ入力してください:");
 7:      scanf("%d", &n);
 8:
 9:      for ( i = 1; i <= n; i++ ){
10:         printf("%d の約数 =", i);
11:         for ( k = i; k >= 1; k-- ){
12:            if ( i % k == 0 ){
13:               printf(" %d", k);
14:            }
15:         }
16:         printf("\n");
17:      }
18:
19:      return 0;
20:   }

9-17 行目: for ( i = 1; i <= n; i++ ){ ... }

 9:      for ( i = 1; i <= n; i++ ){
10:         printf("%d の約数 =", i);
11:         for ( k = i; k >= 1; k-- ){
12:            if ( i % k == 0 ){
13:               printf(" %d", k);
14:            }
15:         }
16:         printf("\n");
17:      }

ここでは,n を読み込んだ後,for 文で変数 i の値を 1 から n まで変化させながら目的の処理を繰り返し行おうとしています.

この for 文でやろうとしていることは,変数 i の値に対して,その約数をすべて出力するというものです.
つまり,
  • i = 1 の時,1 の約数をすべて出力:1
  • i = 2 の時,2 の約数をすべて出力:2,1
  • i = 3 の時,3 の約数をすべて出力:3,1
  • i = 4 の時,4 の約数をすべて出力:4,2,1
  • i = 5 の時,5 の約数をすべて出力:5,1
  • i = 6 の時,6 の約数をすべて出力:6,3,2,1
  • ......

11-15 行目: for ( k = i; k >= 1; k-- ){ ... }

 9:      for ( i = 1; i <= n; i++ ){
10:         printf("%d の約数 =", i);
11:         for ( k = i; k >= 1; k-- ){
12:            if ( i % k == 0 ){
13:               printf(" %d", k);
14:            }
15:         }
16:         printf("\n");
17:      }

この(内側の) for 文では k の値を i から 1 まで減らしながら,i の約数を表示します.

ポイントになるのが,「k が i の約数である」⇔「i が k で割り切れる」⇔「i を k で割った余りが 0」ということです.
そのため,12 行目では i % k == 0 を条件とした if 文があり,これが成立する時にのみ k を出力しています.

今回の実行例では,約数を大きい方から表示していますので, for 文では k の値を i から始めて,k >= 1 の間,k の値を -1 する(k--)という流れになっています.

16 行目: printf("\n");

 9:      for ( i = 1; i <= n; i++ ){
10:         >printf("%d の約数 =", i);
11:         for ( k = i; k >= 1; k-- ){
12:            if ( i % k == 0 ){
13:               printf(" %d", k);
14:            }
15:         }
16:         printf("\n");
17:      }

内側の for 文での繰り返しが終わった後に,改行文字を出力していますが, こうしないと次の約数の出力が同じ行に続いてしまうからです.