我想制作一个程序,在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>
答案 0 :(得分:1)
我决定使用函数调用重写代码。当重复代码时,我总是尝试尽可能多地使用函数和子例程。在这种情况下,检查整数是否为素数是一个明显的选择。
我还将循环减少到仅查看m
和n
之间的数字(我将它们换成圆形,因为我很有趣)并且一旦在该数字和{之间找到了素数{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