2016-11-28 4 views
0

私は素数を生成するはずのdoループでif文を使用しようとしています。そのために私はmoduloを使って数字を整理しました。素数が見つかったら、さらに進んで1を加えて次の素数を見つけ出し、配列pzahlに追加します。私の問題は、ループが無視して、plaufで素数を見つけた後にさらに進んで、無限になるまで続けるべきだということです...私はループとif文の内容を再配置しようとしましたが、働いていない。コードは以下の通りです: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

END DO loop1を終了してください。 – Davislor

+0

END DO loop1は最後にあります。しかし、もし私がむしろ早くそれを使うべきかどうかは、私は完全にはわかりません。 – traytray

答えて

2

それはそれを無視していない、それが正しく実行されます。

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

それはstartが何であるかは重要ではありませんすべての整数手段は1で割り切れるよう、alle(1)は常にゼロになりますminval(alle)もなること常に0になります。つまり、条件minval(alle) /= 0は決して真ではなく、ステートメントは決して実行されません。

追加:最後の値alle(start)は、すべての数値がそれ自体で均等に割り切れるため、ゼロになります。

+0

ヒントをありがとう!私はそれを変えましたが、今は少なくとも半分で動作します。まだ完全ではありませんが。 – traytray

+0

コードに不要な計算がいくつかあります。たとえば、* all *の数字は常にチェックしますが、最初のマッチの後で停止することができます。ターゲットの平方根に到達するまでに除数を見つけられなかった場合、大きなものは存在しないので、停止することができます。 – chw21

+0

これを避けるためにif文をloop2に広告します。私はちょうどFortranを学び始めたので、助けてくれてうれしいです:) – traytray

関連する問題