2016-03-29 17 views
0

Ich habe gerade ein Programm geschrieben, um die gcd von zwei Zahlen zu berechnen. Getestet habe ich es mit den Nummern 6 und 4. Mein Programm ein Ergebnis von 4 gibt, die offensichtlich falsch ist, weil der gcd für 6 und 4 2.bekommen falschen Wert mit meinem gcd-Programm

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;' und 'n = m;' ... Das gerade setzt 'n = n;' –

+0

Auch, warum auch Parameter verwenden, wenn Sie sofort gehen, um sie außer Kraft setzen? –

+0

Warum werden einfache Debugging-Fragen mit Upvotes beantwortet? – redFIVE

Antwort

1

ist Ihr Algorithmus Code ist falsch. Das Fragment

m = n; 
n = m; 

tut nichts nützlich, und der Wert auf tmp zugeordnet ist nichts zu tun.

Holen Sie den Rest, dann den Wert n zu m zuweisen, dann den Rest zu n. Verwenden Sie tmp für diesen Zweck.

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

Zusätzlich warum fragen Sie den Benutzer für m und n Werte in der Methode gcd, wenn Sie bereits Parameter haben? Entweder fragen Sie nicht in gcd und verwenden Sie einfach die Parameter, oder verschieben Sie den JOptionPane Code zu main, und übergeben Sie die Benutzer-Nummern in gcd dort.

+0

Sie müssen jedoch sicherstellen, dass "n <= m" vor dem Start der Schleife. – schwobaseggl

+0

@schwobaseggl Wenn 'n> m', dann wird die erste Schleife die beiden Zahlen effektiv vertauschen. – rgettman

+0

hmm .. 'm% n == 0' für' n> m' => 'n = 0' Schleife über, Rückgabe' 0'. Nicht? – schwobaseggl

-1

Sie können unter Funktion aufrufen (ohne Rekursion) aus dem Hauptverfahren:

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

was ist los mit dieser Antwort? –

-1

Dies funktioniert für mich. Ich habe es mit int gemacht, aber es zu lang zu werfen wäre nicht schwer.

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);} 
Verwandte Themen