2014年5月23日金曜日

覆面算を計算するプログラムを作ってみた(CodeIQ)

CodeIQ 増井技術士事務所さんの問題(https://codeiq.jp/ace/thisweek_masuipeo/q860)に解答するため覆面算のプログラムを作った。Fortranで。

バッジ貰えたのでソースコード公開します:D

    program Console1
    implicit none
 
    integer, parameter :: lm = 9
    integer :: a(0:lm), l
    integer :: i
 
    write(*, 1000)
    1000 format('  a  d  e  i  k  l  r  s  t  w')
 
    l = 0
    do i = 0, lm
        a(l) = i
        call sub(lm, l, a)
    enddo
    end program Console1

    recursive subroutine sub(lm, l, a)
    implicit none
    integer, parameter :: nstde = 0
    integer, intent(in) :: lm, l, a(0:lm)
    integer :: l1, a1(0:lm)
    integer :: i, ii, p, q, r, s
 
    if(l == lm)then
        if(a(6) /= 0 .and. a(9) /= 0 .and. a(8) /= 0 .and. a(7) /= 0)then
            p =                     a(6) * 1000 + a(2) * 100 + a(0) * 10 + a(1)
            q = a(9) * 10000 + a(6) * 1000 + a(3) * 100 + a(8) * 10 + a(2)
            r =                      a(8) * 1000 + a(0) * 100 + a(5) * 10 + a(4)
            s = a(7) * 10000 + a(4) * 1000 + a(3) * 100 + a(5) * 10 + a(5)
            if(s == p + q + r)then
                write(nstde, 1000)(a(i), i = 0, lm)
                1000 format(10(1x,i2))
            endif
        endif
    else
        l1 = l + 1
        a1 = a
        loop1: do i = 0, lm
            a1(l1) = i
            do ii = 0, l
                if(a1(l1) == a1(ii))cycle loop1
            enddo
            call sub(lm, l1, a1)
        enddo loop1
    endif
 
    end subroutine sub

問題ごとにプログラムを書き換える必要はあるけれど、再帰を使って割とシンプルにかけたと思う:)

0 件のコメント:

コメントを投稿