生成和求和素数

Generate and sum prime numbers

我正在尝试求和所有低于 200 万的质数。我已经检查了我的代码几个小时,但我找不到导致它打印出错误数字的原因。

logical function isprime(n) result(response)

    implicit none

    integer :: i
    integer, intent(in) :: n
    integer :: upto

    if (n <= 1) then
        response = .false.
        return
    end if

    upto = int(n**.5)

    do i = 3, upto, 2
        if (mod(n, i) == 0) then
            response = .false.
            return
        end if
    end do

    response = .true.

end function isprime

program problem10

    implicit none

    integer :: n
    logical :: isprime
    integer, parameter :: int64 = selected_int_kind(16)
    integer(kind = int64) :: total

    do n = 1, 2000000
        if (isprime(n)) then
            total = total + n
        end if
    end do

    print *, total

end program problem10

它在应该 142913828922

的时候打印 1179908152

总和溢出 32 位整数。使 total 成为 64 位整数并确保对其进行初始化:

integer, parameter :: int64 = selected_int_kind(16)  ! dec. digits
integer (kind = int64) :: total

total = 0

你的程序也认为 2 不是质数,因为对于 n == 2upto 是 2,可以被 2 整除。删除 + 1 项是安全的upto,至少只要你的整数在用 32 位浮点运算计算平方根时不超过 16,777,216。

最后,您可以通过在求和时不考虑偶数来加快程序速度(当然,从 2 开始)。 isprime 中的循环也可以将偶数作为特殊情况处理,并仅迭代奇数。