2017-03-19 3 views
1

Je veux créer un programme qui trouve des nombres premiers jumeaux dans une certaine plage, de n à m. Ici, il est ce que j'ai jusqu'à présent:Comment trouver un nombre premier double dans une plage déterminée par l'utilisateur dans 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 

J'ai essayé n = 4 et m = 8, attendant d'obtenir 5 et 7, n = 70 et m = 74, voulant 71 et 73, mais dans les deux cas, il ne retourne rien, pourquoi est-ce?

+0

Quelle sortie obtenez-vous? Pourquoi est-ce faux? En haut de ma tête, on dirait que vous n'initialisez pas 'count1' et' count2' à 0. – Ross

+0

Pourquoi pensez-vous que cela ne fonctionne pas? Qu'est ce que ça fait? –

+0

A l'exception de (3, 5) tous les nombres premiers jumeaux sont de la forme (6n-1, 6n + 1). – rossum

Répondre

1

J'ai décidé de réécrire votre code en utilisant un appel de fonction. J'essaie toujours d'utiliser autant que possible les fonctions et les sous-programmes lorsqu'il y a du code répété. Dans ce cas, la vérification pour voir si l'entier était un premier est un choix évident.

J'ai aussi réduit les boucles seulement regarder les numéros entre m et n (je les ai troqué tour parce que je suis drôle comme ça) et une fois premier a été trouvé entre ce nombre et 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 

Il existe plusieurs problèmes avec le code d'origine, les variables de comptage ne sont pas réinitialisées pour chaque boucle. Une fois que cela est corrigé, il y a des problèmes lors de la recherche d'un nombre premier. J'ai trouvé impossible, jusqu'à présent, de maintenir la structure originale et de ne renvoyer que des nombres premiers véritables. Des problèmes découlent de la vérification mod(j, i). Lorsque i > j, le code renvoie j en tant que premier. Quand tous i ne sont pas des facteurs communs de j, il renvoie un premier.

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

Je pense que vous devriez également expliquer ce qui ne va pas avec le code initial – Ross

+0

@Ross J'ai ajouté un petit commentaire. – muddle

+0

Ça a marché, merci. Mais je ne sais toujours pas comment travailler avec les sous-programmes et les fonctions, pourriez-vous s'il vous plaît expliquer ce qui n'allait pas avec mon code? –