Fortran Coder

标题: 对同一个常数,函数前后输出值不同 [打印本页]

作者: 不知道    时间: 2016-10-20 21:17
标题: 对同一个常数,函数前后输出值不同
主程序中首尾两个is_prime(32)输出值不同,这是怎么回事?
把do循环删除后又变得正常了。
[Fortran] 纯文本查看 复制代码
program test
        implicit none
        logical,external :: sum_is_5,is_prime
        integer :: n
        print *,is_prime(32)
        do n=2,100
                if(sum_is_5(n).and.is_prime(n)) print *,n
        end do
        print *,is_prime(32)
end program test
logical function sum_is_5(i)
        implicit none
        integer :: i,digit(3)=0
        sum_is_5=.false.
        digit(1)=mod(i,10)
        digit(2)=mod(i/10,10)
        digit(3)=i/100
        if(sum(digit)==5) sum_is_5=.true.
end function sum_is_5
logical function is_prime(j)
        implicit none
        integer :: j,k=2
        is_prime=.true.
        do while(k<j)
                if(mod(j,k)==0) then
                        is_prime=.false.
                        exit
                end if
                k=k+1
        end do
end function is_prime

123.PNG (31.96 KB, 下载次数: 242)

123.PNG

作者: kerb    时间: 2016-10-20 23:22
本帖最后由 kerb 于 2016-10-20 23:24 编辑

这种判别质数效率比较低
作者: li913    时间: 2016-10-21 09:42
子过程中,定义时赋值(24行,k),变量具有save属性。拆开写:
integer j, k
k=2
作者: 楚香饭    时间: 2016-10-21 09:44
第22行,图片中第24行
  integer :: j,k=2
改为
  integer :: j,k
  k=2

前者 k=2 是第一次赋值。后者 k=2 是每次都赋值。


作者: 不知道    时间: 2016-10-21 10:02
楚香饭 发表于 2016-10-21 09:44
第22行,图片中第24行
  integer :: j,k=2
改为

原来是这样,改了之后就对了,谢谢
作者: 不知道    时间: 2016-10-21 10:04
kerb 发表于 2016-10-20 23:22
这种判别质数效率比较低

这个我知道,但是找一百以内的素数没有必要优化




欢迎光临 Fortran Coder (http://bbs.fcode.cn/) Powered by Discuz! X3.2