在 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 个建议来解决第二个问题:
在 do i = 2, 10000, 1
之前,有另一个循环设置 array
中的每个值。
在 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 之后)时离开循环来优化...
我正在尝试打印质数直到 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 个建议来解决第二个问题:
在
do i = 2, 10000, 1
之前,有另一个循环设置array
中的每个值。在
时设置不同的值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 之后)时离开循环来优化...