繰り返し処理のスキップ

do 文によるループ処理の中で,ある条件が成立する場合は, それ以降の処理を行わずにスキップしたいことがあります. Fortran 90/95 では cycle 文を使うとループをスキップすることができます. 例として,次のような覆面算を考えてみましょう.

   A
+) B
――――
  AC

覆面算は,以下のルールにしたがって,計算式が成り立つような数字を求めるパズルです.

この問題をプログラムを利用して解くには,do ループを使って A, B, C の各文字に数字を当てはめ, 数式が正しく成り立つか総当たりでチェックすればよいでしょう. ただし,A, B, C の中に同じ文字が含まれるかチェックし,同じ文字が含まれない場合にのみ,計算式が成り立つかチェックすればよいことになります. このような考えで作られたプログラムを以下に示します.

program work0501
  implicit none
  integer :: a, b, c, ac
  do a = 1, 9
     do b = 1, 9
        if (b == a) cycle       ! B == A なら以降をスキップ
        do c = 0, 9
           if (c == a) cycle
           if (c == b) cycle
           ac = a * 10 + c
           if (a + b == ac) write(*,*) a, ' + ', b, ' = ', ac
        end do ! c loop
     end do    ! b loop
  end do       ! a loop

  stop
end program work0501

プログラムの流れ

if (b == a) cycle などの部分で,異なる文字に同じ数字が含まれていないかチェックしています. 同じ数字が含まれている場合は cycle 文が実行されます. cycle 文が実行されると,cycle 文が含まれるループの end do に処理が移され,次の繰り返しが行われます. 例えば,b == a.TRUE. になった場合は,「b loop」というコメントのついた end do に処理が移され,次の b の値の繰り返しがスタートすることになります.

練習問題

次の覆面算を do ループと cycle 文を利用して解け.

   AB
+)  A
―――――
  BCC

チャレンジ問題

これまでに学習した範囲でかなり本格的な計算をすることができます. 次の問題に挑戦してみましょう!

コラッツの問題 (Collatz problem)

任意の正整数 n に対して次の操作を繰り返すと有限回で 1 に到達すると予想されている。

これを「コラッツの問題」という。 例えば、n が 3 のときは7回の操作で 1 となる。

3 → 10 → 5 → 16 → 8 → 4 → 2 → 1

キーボードから n を入力し 1 になるまでこの操作を行うプログラムを作成せよ。 20 以下の自然数で 1 になるまでの操作回数がもっとも多い数は何か?

クリックして表示

素数の判定(単純版)

奇数 n が与えられたとき、それが素数かどうか、次のように判定するプログラムを作成せよ。

クリックして表示

覆面算

次の覆面算の解を求めよ.

みず×みず=飲みみず
クリックして表示

整数の問題

3桁の整数で、各桁の数字の3乗和がもとの数と等しくなるようなものをすべて求めよ。

クリックして表示

公約数(ユークリッドの互除法)

ユークリッドの互除法を用いてキーボードから入力した2整数 a, b の最大公約数を求めるプログラムを作成せよ。 ユークリッドの互除法のアルゴリズムは次のようなものである。

step 4 → step 2 のループには繰り返し回数を指定しない do 文を用いる。

クリックして表示