2016-03-29 1 views
0

Je viens d'écrire un programme pour calculer le gcd de deux nombres. Je l'ai testé avec les numéros 6 et 4. Mon programme retourne un résultat de 4 ce qui est évidemment faux parce que le GCD pour 6 et 4 est 2.obtenir la mauvaise valeur avec mon programme gcd

import javax.swing.*; 

public class Zahlen { 
    public static long gcd(long m, long n){ 
    m = Long.parseLong(JOptionPane.showInputDialog("Enter value for m")); 
    n = Long.parseLong(JOptionPane.showInputDialog("Enter value for n")); 
    long tmp; 
    while (n > 0) { 
     tmp = n; 
     m = n; 
     n = m; 
     n = n%m; 
    } // end of while 
    return m; 
    } 

    public static void main(String[] args){ 
    System.out.print(Zahlen.gcd(6,4)); 
    } 
} 
+1

'm = n,' et 'n = m;' ... Ceci définit simplement 'n = n;' –

+0

Aussi, pourquoi même utiliser des paramètres si vous allez les remplacer immédiatement? –

+0

Pourquoi une simple question de débogage obtient-elle des upvotes? – redFIVE

Répondre

1

Votre code d'algorithme est incorrect. Le fragment

m = n; 
n = m; 

ne fait rien utile, et la valeur attribuée à tmp ne fait rien.

Obtenez le reste, puis affectez la valeur n à m, puis le reste à n. Utilisez tmp à cette fin.

while (n > 0) { 
    tmp = m%n; 
    m = n; 
    n = tmp; 
} 

De plus, pourquoi avez-vous demander à l'utilisateur m et n valeurs dans la méthode gcd si vous avez déjà des paramètres? Soit ne pas demander dans gcd et il suffit d'utiliser les paramètres, ou déplacez le code JOptionPane à main, et passez les numéros de l'utilisateur dans gcd là.

+0

Vous devez vous assurer que 'n <= m' avant de démarrer la boucle. – schwobaseggl

+0

@schwobaseggl Si 'n> m', alors la première boucle échangera efficacement les deux nombres. – rgettman

+0

hmm .. 'm% n == 0' pour' n> m' => 'n = 0' boucle, retour' 0'. Ne pas? – schwobaseggl

-1

Vous pouvez appeler la fonction ci-dessous (sans utiliser la récursivité) de méthode principale:

public static int gcd(int n, int m){ 
    int gcd=1; 
    int upto=n>m?m:n; 

    for(int i=1;i<=upto;i++){ 
     if(n%i==0 && m%i==0){ 
      gcd=i; 
     } 
    } 
    return gcd; 
} 
+0

quoi de mal avec cette réponse? –

-1

Cela fonctionne pour moi. Je l'ai fait avec int mais le lancer trop longtemps ne serait pas difficile.

int m = Integer.parseInt(JOptionPane.showInputDialog("Enter value for m")); 
     int n = Integer.parseInt(JOptionPane.showInputDialog("Enter value for n")); 
     int i =1; 
     int gcd=1; 
     while(m>n?i<=n:i<=m){ 
      if(m%i==0&& n%i==0){ 
       gcd=i; 
      } 
      i++; 
     } 
     System.out.println(gcd);}