Variablen vertauschen wenn Bedingung "umgedreht" wird

Bitte aktiviere JavaScript!
Hallo Leute,
Gibt es eine Möglichkeit sich Code zu sparen in folgendem Fall?
Java:
  if (s < n) {
                if (s >= 1) {
                    for (s = 1; s < n; s++) {
                        m = n % s;
                        if (m == 0) {
                            if (s > ggt) {
                                ggt = s;
                            }
                        }

                    }
                }
}
else
und nun will ich eigentlich genau das gleiche machen, nur, dass n und s vertauscht wäre. Ich find das aber doof, wenn ich jetzt alles nochmal (bloss mit vertauschten Variablen) schreiben muss. Gibts vielleicht einen Trick?
PS: den Fall ,dass n=s ist mach ich gesondert
 
A

Anzeige


Vielleicht hilft dir dieser Kurs hier weiter: (hier klicken)
Je nach dem was du eigentlich vor hast, wäre auch noch eine Möglichkeit, den Code einfach in eine Methode auszulagern.
 
Hi,
ich hab euch nicht alles gesagt: ich bin schon in einer main-Methode. Mein Sensei predigte mir: keine Methoden in Methoden. Ich hätte sonst schon Lust drauf.
 
Du rufst die Methode an den Stellen auf, an denen Du den Code stehen hättest, den Du in die Methode ausgelagert hast.

Allerdings weiß ich gar nicht, was Du da eigentlich rechnest: erst prüfst Du, ob 1 <= s < n gilt und dann lässt Du s in der Schleife mit 1 beginnen.
 
Vielleicht sollte man das mal systematisch mit ein paar Vorüberlegungen angehen. Der ggT zweier ganzer Zahlen a und b ist die größte natürliche Zahl c, die sowohl a als auch b ohne Rest teilt.

Wie klein kann c werden? Das ist einfach: 1.
Wie groß kann c höchstens werden? c kann nicht größer als der kleinere der Beträge der beiden Zahlen a und b sein.

Insgesamt gilt: 1 <= c <= min(|a|,|b|)

Da Du den größten Teiler suchst, beginnst Du natürlich mit der größtmöglichen Zahl, die überhaupt als Teiler in Frage kommt: min(|a|, |b|) und hangelst Dich dann bis einfach zur 1 runter. Der erste gefundene Teiler ist dann das Ergebnis.
 
Hi Robat,
oh ähm ich hab noch nicht versucht sie zu erstellen, da mir vorher noch unklar ist folgendes, das ich gerne wüsste, ob ichs richtig versteh:
Es wird nicht gern gesehen, eine Methode in einer Methode sowohl zu deklarieren als auch aufzurufen. Aber wenn ich jetzt separat eine Methode (in einer Klasse) baue, dann dürfte ich sie anschliessend auch im Programm mit der main-Methode aufrufen?
Ich geb mal hier meinen Code und vorher noch die Aufgabe an, die ich lösen will:
Schreiben Sie ein Java-Programm, das die ersten beiden beim Programmaufruf
mitgegebenen Argumente in Integerzahlen umwandelt und von beiden
Zahlen den größten gemeinsamen Teiler bestimmt. Prüfen Sie dann, ob der
ermittelte größte gemeinsame Teiler einer der Zahlen von 1 bis 4 ist. Verwenden
Sie für diesen Test eine switch-Anweisung und geben Sie in dem jeweils
zutreffenden Fall eine entsprechende Meldung aus. Verwenden sie den
default-Fall, wenn der größte gemeinsame Teiler größer als 4 ist.

So und ich bin jetzt soweit:
Java:
public class Kontrollstrukturen2 {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int n = Integer.parseInt(args[0]);
        int s = Integer.parseInt(args[1]);
        int m;
        int ggt = 1;
        try {
            if (s < n) {
                if (s >= 1) {
                    for (s = 1; s < n; s++) {
                        m = n % s;
                        if (m == 0) {
                            if (s > ggt) {
                                ggt = s;
                            }
                        }

                    }
                }
                else throw new ArithmeticException();

            }
            else

        } catch (ArrayIndexOutOfBoundsException e) {
            System.out.println("Falsche Argument-Anzahl.");
        } catch (NumberFormatException e) {
            System.out.println("Mind. ein Argument ist kein int-Wert.");
        } catch (ArithmeticException e) {
            System.out.println("Division durch null.");
        }
        // Hier prüfen, ob ggt aus {1,...,4} else default
        switch (ggt)

        {
        case 1:
            ggt = 1;
            System.out.println("ggT ist 1");
            break;
        case 2:
            ggt = 2;
            System.out.println("ggT ist 2");
            break;
        case 3:
            ggt = 3;
            System.out.println("ggT ist 3");
            break;
        case 4:
            ggt = 4;
            System.out.println("ggT ist 4");
            break;
        default:
            System.out.println("ggT ist ausserhalb von {1,...,4} ");
            break;
        }
    }

}
Ok, mihe7 ich hab mir das so ähnlich gedacht wie Du, bloss dass ichs von 1 an bis zur grössten Zahl probiere, ich hab das Gefühl sonst rückwärts zu suchen, was mir schwieriger vorkommt
 
Zuletzt bearbeitet:
Aber eine Klasse in einer Methode mit einer Methode
Schon klar .. dann deklariere ich aber keine Methode in einer Methode (wie der TE dachte) sondern eine Klasse in einer Methode

@scratchy1
Deinen Algorithmus solltest du noch mal bearbeiten ... für die iterative Variante hier mal als Pseudocode
Code:
SOLANGE num2 != 0 TUE
   temp = num1 % num2
   num1 = num2
   num2 = temp
ggt = num1
Rekursiv gehts natürlich noch kürzer
 
Schon klar .. dann deklariere ich aber keine Methode in einer Methode (wie der TE dachte) sondern eine Klasse in einer Methode

@scratchy1
Deinen Algorithmus solltest du noch mal bearbeiten ... für die iterative Variante hier mal als Pseudocode
Code:
SOLANGE num2 != 0 TUE
   temp = num1 % num2
   num1 = num2
   num2 = temp
ggt = num1
Rekursiv gehts natürlich noch kürzer
Ich versuche es gerade zu verstehen und probiere es mit num1=9 und num2=6:
Java:
while(num2 !=0){
temp=num1%num2;
//9 mod 6 =3.
num1=num2;
// also num1=6.
num2=temp;
// also num2=3.
ggt=num1;
// also ggt=6.
Nehmen wir stattdessen ggt=num2;
erhielten wir den richtigen ggt=3 raus.
Ich probiers nochmal mit anderen Zahlen, vielleicht versteh ichs dann besser, Moment, ach sorry, ich sehs, diw while-schleife muss fortgeführt werden, moment
 
Zuletzt bearbeitet:
Ach, danke ,jetzt hab ichs gesehen, nun überleg ich mir , wie Du das ersonnen hast, wow, moment, also Du nimmst dann immer den Rest, lässt den Dividenden in num1, der neue Dividend wird nun das moduloergebnis aus temp. Moment, das mach ich mal jetzt mit Primzahlen
 
Passende Stellenanzeigen aus deiner Region:

Neue Themen

Oben