2016-11-28 100 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