Fortran 编译器赢得';除非我打印变量,否则不要计算变量”&引用;
显然,根据我是否告诉程序打印变量i,我得到的结果不同,这与我是否打印变量i无关Fortran 编译器赢得';除非我打印变量,否则不要计算变量”&引用;,fortran,fortran90,Fortran,Fortran90,显然,根据我是否告诉程序打印变量i,我得到的结果不同,这与我是否打印变量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*,
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*,行无论如何都会改变variabe的值,这似乎真的很奇怪
例如,如果您自己尝试,当打印行在中时,mini的输出是,例如,输入48是29,这是正确的,它是48到ts一半之间的最小素数,但是当您输入48并且著名的打印行被注释掉时,输出将是-2,而不是29。
你们知道为什么会这样吗 弗朗西斯卡勒斯是对的,
的逻辑是错误的
您可以通过检查程序的第一个结果(打印*,is_prime(n)
)来判断
下面,带有正确的版本是\u 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
编辑:我应该补充一点,受打印声明影响的问题不时出现。当它出现时,它指向代码逻辑中的一个缺陷,然后该缺陷对定义不清的结果变得敏感。@francescalus是对的,的逻辑是错误的
您可以通过检查程序的第一个结果(打印*,is_prime(n)
)来判断
下面,带有正确的版本是\u 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
编辑:我应该补充一点,受打印声明影响的问题不时出现。当它出现时,它指向代码逻辑中的一个缺陷,然后对定义不清的结果变得敏感。你说得对,弗朗西斯,刚刚编辑过,再次抱歉你说得对,弗朗西斯,刚刚编辑过,再次抱歉