显然,根据我是否告诉程序是否打印变量i,我得到的结果与我是否打印它不相关。
PROGRAM hello
IMPLICIT NONE
integer :: n,i, mini
logical :: leave = .false.
read*, n
print*, is_prime(n)
!!---------------------------------------------------------------------
do i=n, n/2, -1
print*, "I= ", i !!if you comment out this line, the result will be different than if you were to keep it, try it out yourselves
if(is_prime(i)) then
mini = i
end if
end do
print*, "the lowest prime number between your number and its half is: ", mini
!!----------------------------------------------------------
CONTAINS
logical function is_prime(n)
integer::n,i
do i=2,n
if(mod(n,i) == 0 .and. (i/=1 .and. i/=n) ) then
is_prime = .false.
elseif(mod(n,i) /=0 .and. i == n-1 .and. is_prime .neqv. .false.) then
is_prime = .true.
end if
end do
return
end function
END PROGRAM
因此,如果您要注释掉我所指出的那行,那么“ mini”的结果将与您保留它的结果不同,正如我所说。 我在fortran还是个新手,所以我不知道我做错了什么,或者这是否与编译器有关,但是对我来说,看起来很奇怪,无论如何都要放置一个print *,line更改可变参数的值,这就是发生的情况。
例如,如果您自己尝试一下,则输入行时mini的输出例如,输入48,为29,这是正确的,它是介于48和ts之间的最小素数,但是当您踩入48,而著名的打印行被注释掉时,输出将是-2,而不是29。 你们当中有人知道为什么会这样吗?
答案 0 :(得分:4)
@francescalus是正确的,is_prime
的逻辑是错误的。
您可以通过检查程序的第一个结果(print *, is_prime(n)
)来判断。
下面是带有正确is_prime
的版本。我首先将.true.
分配给结果,并在测试为真时将其无效化为.false.
。
PROGRAM hello
IMPLICIT NONE
integer :: n,i, mini
read*, n
print*, is_prime(n)
!!---------------------------------------------------------------------
do i=n, n/2, -1
print*, "I= ", i
if(is_prime(i)) then
mini = i
end if
end do
print*, "the lowest prime number between your number and its half is: ", mini
!!----------------------------------------------------------
CONTAINS
logical function is_prime(n)
integer, intent(in) :: n
integer :: i
is_prime = .true.
do i=2,n
if(mod(n,i) == 0 .and. (i/=1 .and. i/=n) ) then
is_prime = .false.
end if
end do
end function is_prime
END PROGRAM
编辑:我应该补充一点,即不时出现与打印语句有关的问题。当它出现时,它指出了代码逻辑中的一个缺陷,然后该缺陷变得对不确定结果的情况变得敏感。