web-dev-qa-db-de.com

Wie schreibe ich ein einfaches Java-Programm, das den größten gemeinsamen Teiler zwischen zwei Zahlen findet?

Hier ist die Frage:

"Schreiben Sie eine Methode namens gcd, die zwei Ganzzahlen als Parameter akzeptiert und den größten gemeinsamen Teiler der beiden Zahlen zurückgibt. Der größte gemeinsame Teiler (GCD) der zwei Ganzzahlen a und b ist die größte Ganzzahl, die ein Faktor von sowohl a als auch b ist. Die GCD einer beliebigen Zahl und 1 ist 1 und die GCD einer beliebigen Anzahl und 0 ist diese Nummer.

Eine effiziente Methode zur Berechnung der GCD von zwei Zahlen ist die Verwendung des Euclid-Algorithmus, der Folgendes festlegt:

GCD(A, B) = GCD(B, A % B) 
GCD(A, 0) = Absolute value of A"

Ich bin wirklich verwirrt, wie ich dieses Problem lösen kann. Ich möchte nur ein paar Hinweise und Tipps, was ich in meinem bisherigen Programm falsch gemacht habe. (Ich muss einen Scanner einsetzen, das ist die Anforderung meines Lehrers.) Geben Sie mir keinen vollständigen Code, da ich das irgendwie selbst lösen möchte. Vielleicht geben Sie mir einfach einen Hinweis, wie ich diese Formel, die Sie oben sehen, einbinden kann. (Und wenn Sie sich fragen, warum ich die == 0 eingebe, liegt das daran, dass ich dachte, wenn Sie zwei Zahlen haben, sagen Sie 0 und 90, dann wäre ihre GCD 0, oder?)

Außerdem muss mein Code while-Schleifen enthalten ... Ich hätte es vorgezogen, wenn Schleifen ...

Danke im Voraus! :)

Mein aktuelles Programm:

public static void main(String[] args) {
        Scanner console = new Scanner(System.in);
        int a = console.nextInt();
        int b = console.nextInt();
        gcd (a, b);
    }

    public static void gcd(int a, int b) {
        System.out.print("Type in two numbers and I will print outs its Greatest Common Divisor: ");
        int gcdNum1 = console.nextInt();
        int gcdNum2 = console.nextInt();
        while (gcdNum1 == 0) {
            gcdNum1 = 0;
        }
        while (gcdNum2 > gcdNum1) {
            int gcd = gcdNum1 % gcdNum2;
        }
        System.out.print(gcdNum1 + gcdNum2);
    }
}
12
user1029481

Eine rekursive Methode wäre:

static int gcd(int a, int b)
{
  if(a == 0 || b == 0) return a+b; // base case
  return gcd(b,a%b);
}

Verwenden einer while-Schleife:

static int gcd(int a, int b)
{
  while(a!=0 && b!=0) // until either one of them is 0
  {
     int c = b;
     b = a%b;
     a = c;
  }
  return a+b; // either one is 0, so return the non-zero value
}

Wenn ich a+b zurückschicke, gebe ich tatsächlich die Zahl ungleich Null zurück, vorausgesetzt, einer von ihnen ist 0.

33
Rushil Paul

Sie können dies auch in einer dreizeiligen Methode tun:

public static int gcd(int x, int y){
  return (y == 0) ? x : gcd(y, x % y);
}

Wenn hier y = 0 ist, wird x zurückgegeben. Andernfalls wird die gcd-Methode mit anderen Parameterwerten erneut aufgerufen.

8
Jason
public static int GCD(int x, int y) {   
    int r;
    while (y!=0) {
        r = x%y;
        x = y;
        y = r;
    }
    return x;
}
2
dansalmo
import Java.util.Scanner;


public class Main {




public static void  main(String [] args)
{
    Scanner input = new Scanner(System.in);
    System.out.println("Please enter the first integer:");
    int b = input.nextInt();
    System.out.println("Please enter the second integer:");
    int d = input.nextInt();

    System.out.println("The GCD of " + b + " and " + d + " is " +  getGcd(b,d) + ".");
}


public static int getGcd(int b, int d)
{
    int gcd = 1;

    if(b>d)
    {
        for(int i = d; i >=1; i--)
        {
            if(b%i==0 && d%i ==0)
            {
                return i;
            }
        }
    }
    else
    {
        for(int j = b; j >=1; j--)
        {
            if(b%j==0 && d% j==0)
            {
                return j;
            }
        }
    }   
    return gcd;

}
}
1
Ricardo Saca
import Java.util.Scanner;

class CalculateGCD 
{   
  public static int calGCD(int a, int b) 
  { 
   int c=0,d=0;  
   if(a>b){c=b;} 
   else{c=a;}  
   for(int i=c; i>0; i--) 
   { 
    if(((a%i)+(b%i))==0) 
    { 
     d=i; 
     break; 
    } 
   } 
   return d;  
  }  

  public static void main(String args[]) 
  { 
   Scanner sc=new Scanner(System.in); 
   System.out.println("Enter the nos whose GCD is to be calculated:"); 
   int a=sc.nextInt(); 
   int b=sc.nextInt(); 
   System.out.println(calGCD(a,b));  
  } 
 } 
0
mkn24
private static void GCD(int a, int b) {

    int temp;
    // make a greater than b
    if (b > a) {
         temp = a;
         a = b;
         b = temp;
    }

    while (b !=0) {
        // gcd of b and a%b
        temp = a%b;
        // always make a greater than bf
        a =b;
        b =temp;

    }
    System.out.println(a);
}
0
Andy

Nun, ich habe gerade vor etwa einer Woche mit dem Programmieren angefangen, also nichts Besonderes, aber ich hatte dieses Problem und kam dazu, was für Leute, die gerade erst mit dem Programmieren beginnen, leichter zu verstehen ist. Es verwendet die Methode von Euclid wie in den vorherigen Beispielen.

public class GCD {
  public static void main(String[] args){
    int x = Math.max(Integer.parseInt(args[0]),Integer.parseInt(args[1]));    
    int y = Math.min(Integer.parseInt(args[0]),Integer.parseInt(args[1]));     
    for (int r = x % y; r != 0; r = x % y){
      x = y;
      y = r;
    }
    System.out.println(y);
  }
}
0
Forrest G.

Eine Möglichkeit ist der folgende Code:

        int gcd = 0;
        while (gcdNum2 !=0 && gcdNum1 != 0 ) {
        if(gcdNum1 % gcdNum2 == 0){
            gcd = gcdNum2;
        }
            int aux = gcdNum2; 
            gcdNum2 = gcdNum1 % gcdNum2;
            gcdNum1 = aux;
    }

Sie brauchen dafür keine Rekursion.

Und sei vorsichtig, es heißt, wenn eine Zahl Null ist, dann ist die GCD die Zahl, die nicht Null ist. 

    while (gcdNum1 == 0) {
    gcdNum1 = 0;
}

Sie sollten dies ändern, um die Anforderung zu erfüllen. 

Ich werde Ihnen nicht sagen, wie Sie Ihren Code vollständig ändern, sondern nur, wie Sie die gcd berechnen.

0
andreih