2016-11-28 112 views
0

我想在做循环这应该生成素数的if语句。为此我用modulo来整理数字。之后,它发现了一个素数,我希望它再向前迈进一步,并添加1,使得下一素数可以发现并添加到阵列pzahl。我的问题是,循环似乎忽略它应该更进一步与plauf后,发现了一个素数,以便它只是不断下去,直到无穷大......我试图重新循环语句的,如果内容,但它只是不工作。下面是代码:DO循环忽略if语句

PROGRAM Primzahlen 

    IMPLICIT NONE 

    INTEGER :: start, plauf, n, a 
    INTEGER, ALLOCATABLE, DIMENSION(:) :: pzahlen !array into which the prime numbers should be added 
    INTEGER :: input 
    INTEGER, DIMENSION(:), ALLOCATABLE :: alle 

    PRINT *, "How many prime numbers should be listed" 
    READ (*,*) input 
    ALLOCATE (pzahlen(input)) 
    pzahlen(1) = 1 
    start = 2 
    plauf = 1 

loop1: DO 

    ALLOCATE(alle(start)) 

    loop2: DO n = 1,start 
     alle(n)= MODULO(start,n) 
    END DO loop2 

    IF (minval(alle) /= 0) THEN ! This is what it seems to ignore. 
    plauf= plauf + 1 
    pzahlen(plauf) = start 
    PRINT *, plauf 
    END IF 

    start = start + 1 

IF (plauf == eingabe) then 
    EXIT 
END IF 
PRINT *, alle 
DEALLOCATE(alle) 

END DO loop1 

PRINT *, "prime numbers:" , pzahlen(1:input) 

END PROGRAM Primzahlen 

我使用gfortran编译器和它是否可以帮助了解写在Emacs。

+0

你不应该做到底LOOP1? – Davislor

+0

END DO loop1在结尾处。但我不完全确定是否应该更早使用它。 – traytray

回答

2

它没有忽视它,它正确地执行:

loop2: DO n = 1,start 
    alle(n)= MODULO(start,n) 
END DO loop2 

不要紧,什么start是,alle(1)将始终为零,因为每个整数是1整除这意味着,minval(alle)也将永远是零,这意味着条件minval(alle) /= 0是不正确的,并且该语句将不会执行。

补充:最后一个值,alle(start),也将是零,因为每个数字是由自身整除。

+0

感谢您的提示!我已经改变了这一点,现在它至少可以工作一半。虽然它还不完美。 – traytray

+0

代码中有几件事是不必要的计算。例如,你总是检查*所有*号码,而你可以在第一场比赛后停止。如果在达到目标的平方根时没有找到除数,则可以停止,因为没有更大的一个。 – chw21

+0

我会在if语句中加入loop2来避免这种情况。我刚开始学习Fortran,所以很高兴帮助你:) – traytray