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

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

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

自然数 n を読み込み,1 ~ n についてそれぞれの最大約数を表示する.
ただし,対象の自然数そのものを除く.
例えば,10 の場合,約数は 1, 2, 5, 10 であるが,10 そのものを除くと最大約数は 5 となる.
 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 = 2; i <= n; i++ ){
10:         printf("%d の最大約数 =", i);
11:         for ( k = i-1; k >= 1; k-- ){
12:            if ( i % k == 0 ){
13:               printf(" %d", k);
14:               break;	    
15:            }
16:         }
17:         printf("\n");
18:      }
19:
20:      return 0;
21:   }

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

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

サンプルプログラム 4 と同様に, n を読み込んだ後,for 文で変数 i の値を変化させながら目的の処理を繰り返し行おうとしています.

ただし,サンプルプログラム 4 と異なり, ここでは 2 以上 n 以下の範囲にしています.
なぜなら,ここで求める最大約数には「対象の数そのものを含めない」ので 1 の最大約数は存在しないことになります. (1 の約数は 1 しかないため)

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

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

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

繰り返しになりますが,「対象の数そのもの」(つまり i )は約数に含めないため, k の値は i からではなく,i-1 から探し始めます

約数かどうかはサンプルプログラム 4 と同じであり, 「i を k で割った余りが 0」ということです.
そのため,13 行目では i % k == 0 を条件とした if 文があり,これが成立する時に k を出力しています.

14 行目: break;

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

この場合,大きい方から約数を探しているので,一つ見つかった時点でそれ以降は打ち切ることになります.

for 文や while 文での繰り返し途中で打ち切るには break 文を使います.
break 文を実行すると,その break 文を含んでいる最も内側の繰り返し(for 文,while 文)のみを打ち切ります.

break による打ち切りがないと,すべての約数を出力してしまうので目的に合わなくなってしまいます.
  • i = 2 の時,2 未満の約数:1
  • i = 3 の時,3 未満の約数:1
  • i = 4 の時,4 未満の約数:2,1    → 2 を出力した時点で打ち切り
  • i = 5 の時,5 未満の約数:1
  • i = 6 の時,6 未満の約数:3,2,1    → 3 を出力した時点で打ち切り
  • ......