如何在Fortran中找到用户确定的范围内的孪生素数

时间:2017-03-19 04:11:37

标签: fortran primes

我想制作一个程序,在n到m的某个范围内找到孪生素数。到目前为止,这就是我所拥有的:

             program twin
                 implicit none
                 integer  i, count1, n, m, count2, j, k, pri1, pri2
                 count1 = 0
                 count2 = 0
                 read(5,*)n
                 read(5,*)m
                 do i = 1,m
                    do j = n,m
                    if (mod(j,i) ==0) then
                         count1 = count1 +1
                    else
                         count1 = count1
                         if(count1 ==0) then
                            pri1 = j
                            do k=j,m
                            if (mod(k,i)==0) then
                               count2 = count2 +1
                            else
                               count2 = count2
                               if(count2 ==0) then
                                 pri2 = k
                                 if (pri2-pri1 == 2) then
                                     write(*,*)j,k
                                 end if
                               end if
                            end if
                            end do
                         end if
                     end if
                     end do
                 end do
             end program twin

我试过n = 4和m = 8,期望得到5和7,n = 70和m = 74,想要71和73,但在这两种情况下它都没有返回任何东西,为什么会这样? / p>

1 个答案:

答案 0 :(得分:1)

我决定使用函数调用重写代码。当重复代码时,我总是尝试尽可能多地使用函数和子例程。在这种情况下,检查整数是否为素数是一个明显的选择。

我还将循环减少到仅查看mn之间的数字(我将它们换成圆形,因为我很有趣)并且一旦在该数字和{之间找到了素数{1}}。

n

原始代码存在一些问题,计数变量不会针对每个循环重新初始化。一旦修复,检查素数时就会出现问题。到目前为止,我发现保持原始结构并仅返回真正的素数是不可能的。问题来自program twin implicit none integer :: m, n, i, j, prime1, prime2 read(*,*)m read(*,*)n do i = m, n if (is_prime(i)) then prime1 = i do j = i, n if (is_prime(j)) then prime2 = j if (prime2-prime1 == 2) then write(*,*)i, j end if end if end do end if end do contains function is_prime(num) result(output) implicit none integer, intent(in) :: num logical :: output integer :: i integer :: count count = 0 if (num > 1) then do i = 2, num-1 if (mod(num, i) == 0) then count = count + 1 end if end do else count = count + 1 end if if (count .eq. 0) then output = .true. else output = .false. end if end function is_prime end program twin 检查。当mod(j, i)时,代码返回i > j作为素数。当所有j不是i的常见因素时,它会返回素数。

j