PROGRAM Erastotheneen_seula IMPLICIT NONE INTEGER, PARAMETER :: iso = SELECTED_INT_KIND(9) INTEGER(iso) :: max_nro INTEGER(iso), DIMENSION(:), ALLOCATABLE :: numerot INTEGER(iso) :: i, alku_lkm INTEGER :: ok WRITE (*,*) 'Syötä alkulukujen yläraja: ' READ (*,*) max_nro IF (max_nro > 2) THEN ALLOCATE (numerot(max_nro), STAT=ok) IF (ok /= 0) THEN WRITE (*,*) 'Muistinvaraus epäonnistui!' STOP END IF ! Taulukon alustus luvuilla 0, 2, 3, 4, ... numerot = (/ 0, (i, i = 2, max_nro) /) DO i = 2, FLOOR(SQRT(REAL(max_nro))) IF (numerot(i) /= 0) THEN numerot(2*i:max_nro:i) = 0 ENDIF END DO ! Lasketaan alkulukujen lkm alku_lkm = COUNT(numerot /= 0) ! Kerätään alkuluvut taulukon alkuun numerot(1:alku_lkm) = PACK(numerot, numerot /= 0) ! Tulostus WRITE (*,'(A,I10,A,I10)') 'Löysin ', alku_lkm, & ' kpl alkulukuja, jotka olivat <=', max_nro WRITE (*,'(5I10)') numerot(1:alku_lkm) ELSE WRITE (*,*) 'Ylärajan täytyy olla > 2!' END IF END PROGRAM Erastotheneen_seula