生成和求和素数
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 == 2
,upto
是 2,可以被 2 整除。删除 + 1
项是安全的upto
,至少只要你的整数在用 32 位浮点运算计算平方根时不超过 16,777,216。
最后,您可以通过在求和时不考虑偶数来加快程序速度(当然,从 2 开始)。 isprime
中的循环也可以将偶数作为特殊情况处理,并仅迭代奇数。
我正在尝试求和所有低于 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 == 2
,upto
是 2,可以被 2 整除。删除 + 1
项是安全的upto
,至少只要你的整数在用 32 位浮点运算计算平方根时不超过 16,777,216。
最后,您可以通过在求和时不考虑偶数来加快程序速度(当然,从 2 开始)。 isprime
中的循环也可以将偶数作为特殊情况处理,并仅迭代奇数。