2016-11-28 4 views
0

Я пытаюсь использовать оператор if в цикле do, который должен генерировать простые числа. Для этого я использовал modulo для сортировки чисел. После того, как он найдет простое число, я хочу, чтобы он сделал шаг дальше и добавил 1, чтобы следующее простое число можно было найти и добавить в массив pzahl. Моя проблема заключается в том, что цикл, кажется, игнорирует, что он должен идти дальше с plauf после того, как он нашел простое число, чтобы он продолжал идти до бесконечности ... Я попытался изменить содержимое цикла и оператора if, но это просто не работает. Вот код:Do-loop игнорирует if-statement

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

КОНЕЦ 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, чтобы этого избежать. Я только начал изучать Фортрана, поэтому вам приятно помочь :) – traytray