PROGRAM primi IMPLICIT NONE INTEGER :: n INTERFACE FUNCTION NumeriPrimi(max) RESULT(lista) IMPLICIT NONE INTEGER, INTENT(INOUT) :: max INTEGER, DIMENSION(:), POINTER :: lista END FUNCTION NumeriPrimi END INTERFACE DO PRINT *, "Digita un intero" READ *, n IF ( n .LE. 0 ) EXIT WRITE(*,*) NumeriPrimi(n) END DO STOP END PROGRAM primi FUNCTION NumeriPrimi(max) RESULT(lista) IMPLICIT NONE INTEGER, INTENT(INOUT) :: max INTEGER, DIMENSION(:), ALLOCATABLE :: primi INTEGER, DIMENSION(:), POINTER :: lista INTEGER :: i, n, quanti, st ALLOCATE(primi(max), STAT=st) IF ( st .NE. 0 ) THEN PRINT *, "errore allocazione PRIMI(",max,")" ELSE primi = (/ (i, i = 1, max) /) quanti = 0 DO i = 2, max IF ( primi(i) .GT. 0 ) THEN DO n = i + 1, max IF ( primi(n) .GT. 0 .AND. MOD(primi(n), i) .EQ. 0 ) THEN primi(n) = 0; quanti = quanti + 1 END IF END DO END IF END DO END IF ALLOCATE(lista(max - quanti), STAT=st) IF ( st .NE. 0 ) THEN PRINT *, "errore allocazione LISTA(",(max - quanti),")" ELSE lista = 0 i = 0 DO n = 1, max IF ( primi(n) .GT. 0 ) THEN i = i + 1 IF ( i .GT. (max - quanti) ) THEN PRINT *, " I > ",(max - quanti) ELSE lista(i) = primi(n) END IF END IF END DO END IF DEALLOCATE(primi) RETURN END FUNCTION NumeriPrimi