Главный генератор в Фортране - PullRequest
0 голосов
/ 06 мая 2011

Я просто пытаюсь немного познакомиться с Фортраном (потому что я могу), поэтому я написал эту небольшую программу, которая использует Сито Эратосфена для генерации простых чисел.Вот программа:

program prime
implicit none
integer num_primes, at, found, i
logical is_prime
integer, allocatable, dimension(:) :: primes ! array that will hold the primes
print *, "How many primes would you like to find?"
read (*, *) num_primes
allocate (primes(num_primes))
primes(1) = 2
at = 2
found = 1
do
    is_prime = .true. ! assume prime
    do i = 1, found
        if (modulo(at, primes(i)) == 0) then ! if divisible by any other element
            is_prime = .false.               ! in the array, then not prime.
            at = at + 1
            continue
        end if
    end do
    found = found + 1
    primes(found) = at
    print *, at
    at = at + 1
    if (found == num_primes) then ! stop when all primes are found
        exit
    endif
end do

простое завершение программы

Запуск этой программы покажет, в чем заключается ошибка, например, попытка найти 10 простых чисел приведет к следующим числам: 3, 57, 11, 13, 16, 17, 19, 23. Очевидно, 16 не простое число.Что может быть не так?

Ответы [ 2 ]

3 голосов
/ 06 мая 2011

Это не сито Эратосфена, которому не нужно modulo.Это своего рода пробное деление, но когда вы найдете делитель, вы увеличиваете at на 1 и начинаете тестирование со следующего простого числа, с которого вы должны начать заново.Когда вы обнаружите, что 15 делится на 3, at увеличивается до 16 и проверяется на 5, 7, 11, которые, конечно, не являются делителями 16, и поэтому печатается 16.

Я непрограммист на Фортране, но я думаю, что вы должны заменить строки

at = at + 1
continue

на

exit

и выполнить строки

found = found + 1
primes(found) = at
print *, at

, только если is_prime имеет значение true.

2 голосов
/ 25 мая 2011

Вот рабочая программа, реализующая предложение Хенрика (а затем я сделал несколько изменений форматирования):

program prime
implicit none

integer :: num_primes, at, found, i
logical :: is_prime
integer, allocatable, dimension(:) :: primes ! array that will hold the primes

print *, "How many primes would you like to find?"
read(*, *) num_primes
allocate(primes(num_primes))
primes(1) = 2
at = 2
found = 1
do
    is_prime = .true. ! assume prime
    do i = 1, found
        if (modulo(at, primes(i)) == 0) then ! if divisible by any other element
            is_prime = .false.               ! in the array, then not prime.
            exit
        end if
    end do
    if (is_prime) then
        found = found + 1
        primes(found) = at
        print *, at
    end if
    at = at + 1
    if (found == num_primes) then ! stop when all primes are found
        exit
    end if
end do
end program prime

Когда вы запустите это, вы получите:

 How many primes would you like to find?
20
           3
           5
           7
          11
          13
          17
          19
          23
          29
          31
          37
          41
          43
          47
          53
          59
          61
          67
          71

и массив primes будет содержать все простые числа. Это то, что вы хотели?

...