2017-03-19 3 views
1

双子素数をnからmまでの範囲で見つけるプログラムを作ってみたいのですが、ここでは、私がこれまで持っているものである。Fortranでユーザーが決めた範囲の双子素数を見つける方法

   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 

Iは、n = 4を試み、そしてm = 8、5および7を得ることを期待し、N = 70及びM = 74、71及び73を望むが、両方にそれが何も返さないケースはどうしてですか?

+0

出力は何ですか。なぜそれは間違っているのですか?私の頭の上から、 'count1'と' count2'を0に初期化していないようです。 – Ross

+0

なぜそれはうまくいかないと思いますか?それは何をするためのものか? –

+0

(3,5)を除き、すべての双子素数は(6n-1,6n + 1)の形をしています。 – rossum

答えて

1

私は関数呼び出しを使用してコードを書き直すことにしました。私は、繰り返しコードがあるときは、できるだけ多くの関数とサブルーチンを使用しようとします。この場合、整数が素数であるかどうかを確認することは明らかな選択です。

私はまた、唯一のmn間の数字を見て(私はそのような面白いだから、私はそれらをラウンドスワップ)とプライムは、その数と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がプライムを返します。

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

end program twin 
+0

あなたはまた、初期コードで何が間違っているのかを説明するべきだと思います。 – Ross

+0

@Ross小さなコメントを追加しました。 – muddle

+0

それは働いて、ありがとう。しかし、私はまだサブルーチンと関数を扱う方法を知らないので、私のコードに何が間違っていたのか教えてください。 –

関連する問題