PROGRAM MAIN IMPLICIT NONE INTEGER :: N, I, J INTEGER, ALLOCATABLE, DIMENSION(:) :: IS_PRIME, WIN_LOSE READ *, N IF (N < 4) THEN PRINT *, 'Lose' RETURN END IF IS_PRIME = ERATOSTHENES(N) ! PRINT *, IS_PRIME(:) ! この後において、勝敗判定を行う。 ALLOCATE(WIN_LOSE(N)) ! WIN_LOSE = 1(勝ち) 0(負け) WIN_LOSE = 0 DO I = 4, N DO J = 1, I - 2 IF (IS_PRIME(J) == 0) THEN CYCLE END IF IF (WIN_LOSE(I - J) == 0) THEN WIN_LOSE(I) = 1 EXIT END IF END DO END DO IF (WIN_LOSE(N) == 1) THEN PRINT *, 'Win' ELSE PRINT *, 'Lose' END IF CONTAINS FUNCTION ERATOSTHENES(N) RESULT(IS_PRIME) IMPLICIT NONE INTEGER, INTENT(IN) :: N INTEGER, ALLOCATABLE, DIMENSION(:):: IS_PRIME INTEGER :: I, J ALLOCATE(IS_PRIME(N)) IS_PRIME = 1 ! エラトステネスの篩を実装するよ。 ! IS_PRIME = 1(素数) 0(合成数・1) IS_PRIME(1) = 0 IS_PRIME(2) = 1 DO I = 2, N IF (IS_PRIME(I) == 0) THEN CYCLE END IF IF (I * I > N) THEN EXIT END IF DO J = I * I, N, I IS_PRIME(J) = 0 END DO END DO RETURN END FUNCTION ERATOSTHENES END PROGRAM MAIN