在 Fortran 中获取直到 10000 的质数?

Getting the prime numbers till 10000 in fortran?

我正在尝试打印质数直到 10000。(显示前五个用于测试) 这是我的程序

program primes
    implicit none
    
    integer :: array(1229)
    integer :: i, ind
    logical :: is_prime
    ind = 1
    do i = 2, 10000, 1
        if (is_prime(i) .eqv. .true.) then
            array(ind) = i
            ind = ind + 1
        end if
    end do
    
    print *, array(1)
    print *, array(2)
    print *, array(3)
    print *, array(4)
    print *, array(5)
end program primes

function is_prime(n) result(ispr)
    implicit none
    
    integer :: c, i
    integer, intent(in) :: n
    logical :: ispr

    c = 0
    do i = 2, n
        if (mod(i,2) == 0) then
            c = c + 1
        end if
    end do
    
    ispr = (c == 0)
    
end function is_prime

我不知道为什么,但这是输出

     9175178
     6417360
     5374044
     6750309
     7536745

为什么会出现这种情况以及如何纠正?

虽然我不熟悉现代 Fortran,但在我看来 function is_prime(n) result(ispr) 似乎不起作用。

在该函数的 do 循环中,您需要一个这样测试的循环:

  • n 能被 2 整除吗?
  • n 能被 3 整除吗?
  • n 能被 4 整除吗?
  • n 能被 5 整除吗?

等等。

但是,实际上在问这些问题:

  • 2能被2整除吗?
  • 3能被2整除吗?
  • 4能被2整除吗?
  • 5能被2整除吗?

等等。

因此,您的计数器将始终具有 non-zero 值,并且您的函数将始终 return false.

但是,这不是唯一的问题。从您的结果来看,您的 Fortran 实现似乎不会自动初始化变量。假设我有如下语句:

integer :: b
print *,b

结果会怎样?

请记住,变量的名称代表计算机内存中的位置。如果一个变量没有被初始化,它的值将是你的程序开始到 运行 之前内存位置中的值。该值不会与您的程序相关。

我有 2 个建议来解决第二个问题:

  1. do i = 2, 10000, 1 之前,有另一个循环设置 array 中的每个值。

  2. do i = 2, 10000, 1 循环中设置每个 array (i) 的值。一种方法是在 (is_prime(i) .eqv. .true.)true 时设置一个值,在 false.

    时设置不同的值

is_prime 应该是(n 是 n 除了 1 <=> c == 1 之外的唯一分隔符)

function is_prime(n) result(ispr)
    implicit none
    
    integer :: c, i
    integer, intent(in) :: n
    logical :: ispr

    c = 0
    do i = 2, n
        if (mod(n,i) == 0) then
            c = c + 1
        end if
    end do
    
    ispr = (c == 1)
    
end function is_prime

可以通过在 c == 1 且 i < n(向 c 加 1 之后)时离开循环来优化...

online fortran compiler

version with exit loop