!
PROGRAM ROMAN
IMPLICIT NONE
INTEGER :: CHOICE
CHARACTER(LEN=10) :: ROMN
INTEGER :: ARABIC
LOGICAL :: VALID
PRINT *, " Enter Arabic numeral: "
READ *, ARABIC
CALL AR2ROM (ARABIC, ROMN, VALID)
IF (VALID) THEN
PRINT *, ROMN
ELSE
PRINT *, " Invalid Arabic numeral"
END IF
! End of program.
STOP
END PROGRAM ROMAN
!***********************************************************************************************************************************
! AR2ROM
!
! This function converts an Arabic numeral to a Roman numeral.
!
! Input:
! ARB - Arabic numeral (integer)
! Outputs:
! ROM - Roman numeral (character string)
! VALID - Returns .TRUE. if input was valid, .FALSE. if invalid
!
! This function will set the VALID flag to .FALSE. if the input Arabic numeral is negative or zero.
!***********************************************************************************************************************************
SUBROUTINE AR2ROM (ARB, ROM, VALID)
IMPLICIT none
INTEGER, INTENT(IN) :: ARB ! input Arabic numeral
INTEGER ARBx ! Added 2013-07-25
CHARACTER(LEN=10), INTENT(OUT) :: ROM ! output Roman numeral string
LOGICAL, INTENT(OUT) :: VALID ! output valid flag
INTEGER :: I, J, LEFT
! Start of code.
! Check for invalid Arabic numeral (non-positive).
! If invalid, set VALID flag to .FALSE. and exit.
IF (ARB .LE. 0) THEN
VALID = .FALSE.
ROM = '0'
RETURN
END IF
! Initialize variables.
VALID = .TRUE.
LEFT = ARB
J = 1
! Begin successive subtractions from Arabic numeral to find corresponding Roman numerals.
! Note that multiple I, X, C, or M may occur, but only (at most) one each of: IV, V, IX, XL, L, XC, CD, D, CM.
! Account for 1000's (M).
IF (LEFT .GE. 1000) THEN
DO ARBx = 1, LEFT ! Modif.2013-07-25
LEFT = (LEFT - 1000)
ROM(J:J) = "M"
J = J + 1
END DO ! Added 2013-07-25
END IF
! Account for 900 (CM).
IF (LEFT .GE. 900) THEN
LEFT = LEFT - 900
ROM(J:J+1) = 'CM'
J = J + 2
END IF
! Account for 500 (D).
IF (LEFT .GE. 500) THEN
LEFT = LEFT - 500
ROM(J:J) = 'D'
J = J + 1
END IF
! Account for 400 (CD).
IF (LEFT .GE. 400) THEN
LEFT = LEFT - 400
ROM(J:J+1) = 'CD'
J = J + 2
END IF
! Account for 100's (C).
IF (LEFT .GE. 100) THEN
LEFT = LEFT - 100
ROM(J:J) = 'C'
J = J + 1
END IF
! Account for 90 (XC).
IF (LEFT .GE. 90) THEN
LEFT = LEFT - 90
ROM(J:J+1) = 'XC'
J = J + 2
END IF
! Account for 50 (L).
IF (LEFT .GE. 50) THEN
LEFT = LEFT - 50
ROM(J:J) = 'L'
J = J + 1
END IF
! Account for 40 (XL).
IF (LEFT .GE. 40) THEN
LEFT = (LEFT - 40)
ROM(J:J+1) = 'XL'
J = J + 2
END IF
! Account for 10's (X).
IF (LEFT .GE. 10) THEN
DO ARBx = 1, LEFT ! Modif.2013-07-25
LEFT = (LEFT - 10)
ROM(J:J) = "X"
J = J + 1
END DO
END IF
! Account for 9 (IX).
IF (LEFT .GE. 9) THEN
LEFT = LEFT - 9
ROM(J:J+1) = 'IX'
J = J + 2
END IF
! Account for 5 (V).
IF (LEFT .GE. 5) THEN
LEFT = LEFT - 5
ROM(J:J) = 'V'
J = J + 1
END IF
! Account for 4 (IV).
IF (LEFT .GE. 4) THEN
LEFT = LEFT - 4
ROM(J:J+1) = 'IV'
J = J + 2
END IF
! Account for 1's (I).
IF (LEFT .GE. 1)THEN
DO ARBx = 1, LEFT ! Modif.2013-07-25
LEFT = (LEFT - 1)
ROM(J:J) = 'I'
J = J + 1
END DO
END IF
! End of code - return Roman numeral string and VALID flag.
RETURN
END SUBROUTINE AR2ROM