# Kleinster gemeinsamer Teiler



## dklueh (27. Mrz 2005)

Hallo und Frohe Ostern!

Zuersteinmal:
Ich bin neu in diesem Forum, aber begeistert, wie viele Leute hier aktiv sind! Ich würde Java vermtulich schneller erlernen, wenn ich schon mal eher hier etwas gepostet hätte 

Zu meinem Problem:
Ich bin noch ein JAVA-Neuling und möchte ein kleines Programm schreiben, welches den kleinsten gemeinsamen Teiler errechnen kann. Folgendes hab ich bisher versucht:



```
{ 
int a, b;
a = Text.ReadInt(in);
b = Text.ReadInt(in);
while (a != b)
{
if (a < b)
a = a - b;
else b = b - a;
}
System.out.println(a);
}
```

Ist das soweit korrekt, oder habe ich da auch Mist gebaut??? 

Wenn das richtig ist, möchte ich nun gerne die Initialisierung der Variablen ändern:
Ich möchte das Ganze als Klasse "kalkulieren" behandeln und duch 

```
public int lcd(int a, int b)
```
ersetzen. Allerdings verstehe ich nicht, wie der weitere Aufruf innerhalb des Codes erfolgen muss...

Kann mir da jemand von euch helfen?

Vielen Dank im Voraus!

Grüße,
Daniel


----------



## mic_checker (27. Mrz 2005)

Du willst die Berechnung des kleinsten gemeinsamen Teilers in einer Methode durchführen, aber du weisst jetzt nicht wie du diese Methode aufrufen sollst?

Schreib dir halt ne Klasse, in dieser definierst du die Methode:


```
public int lcd(int a, int b) {
//Berechnung vom kleinsten gemeinsamen Teiler
}
```

Dann kannst du z.B. in der main Methode deiner Klasse die Methode aufrufen:


```
int ret = lcd(ersteZahl,zweiteZahl);
```

Auf den ersten Blick sieht der Code allerdings nicht richtig aus.


----------



## bygones (27. Mrz 2005)

mhm - nicht so ganz - wenn er die Methode aus der main methode aufrufen soll muss entweder die Methode static sein oder du musst vorher eine Instanz der Klasse erzeugen.

der code so mic_checker wird nicht erfolgreich sein


----------



## mic_checker (27. Mrz 2005)

Ui, hab gar nicht gesehen das es keine Klassenmethode ist, normalerweise ruf ich so was auch nicht in main auf, sondern erzeug ein Objekt etc. pp.

Das passiert wenn man bis morgens weg ist und eigentlich noch schlafen sollte


----------



## Guest (27. Mrz 2005)

Hmm...werd das gleich mal ausprobieren!

Ist denn der Code ansonsten korrekt? oder entdeckt ihr noch irgendwo Fehler?


----------



## mic_checker (27. Mrz 2005)

Denk dran: Es reicht nicht am Ende das a auszugeben, du musst es mit return zurückgeben (die Methode hat int als Rückgabewert).

Deine Berechnung des kleinsten gemeinsamen Teillers stimmt allerdings nicht. Kannst es ja mal mit Beispielen ausprobieren und wirst stehen das es nicht klappt.


----------



## dklueh (28. Mrz 2005)

@mic_checker:
Hmmm...Du hast recht, der schmeist irgendeinen Mist heraus...
Aber ich finde den Fehler nicht...sieht jemand mehr als ich?


----------



## Hansdampf (28. Mrz 2005)

lol, kleinster gemeinsamer Teiler! Das dürfte bei einer natürlichen Zahl IMMER 1 sein.
Falls du den ggt meinst:


```
public static int ggt(int a, int b)
{
  int t;
  if(a<0)a=-a;
  if(b<0)b=-b;
  while(b!= 0){t=a%b;a=b;b=t;}
  return a;
}
```

Solche Methoden macht man übrigens static, wie auch alle Methoden in Math static sind.


----------



## mic_checker (28. Mrz 2005)

Ich ging eher mal davon aus das er den kGV meinte und dies nur "kleinsten gemeinsamen teiler" nannte. Aber das kann er uns nur selber beantworten 



> Solche Methoden macht man übrigens static, wie auch alle Methoden in Math static sind.


Wenn er die Methode aus der main heraus direkt aufruft (und nicht erst Objekt erzeugt und dann auf dieses Objekt die Methode anwändt), ist ja logisch das die static sein soll.....


----------



## Hansdampf (28. Mrz 2005)

stimmt, aber das ist allgemein unnötig, bei solchen Methoden eine Klasse drumrum zu bauen, es wird ja kein innerer Zustand verwaltet.
kgV:

```
public static long euklid(long a,long b)
{
  long ggt,kgv;
  if (a>b){long h=a;a=b;b=h;}
  long r;
  while (a>0) {r=b%a; b=a; a=r;}
  ggt=b;
  kgv=(a*b)/ggt;
 return kgv;  
//p("ggt:"+ggt+"  kgv:"+kgv);
}
```


----------



## dklueh (28. Mrz 2005)

Tja...wenn ich mal wüsste, was genau gemeint ist...
Diese Aufgabe habe ich aus einem billig Java-Buch...leider ist keine Lösung dabei.

Ich poste euch mal die Aufgabenstellung...vielleicht werdet ihr daraus schlau?

Das bei N der kleinste Teiler die 1 ist, weiß ich...  8) Aber ich glaube, die Aufgabe an sich ist sehr missverständlich:



> Erstellen Sie ein Projekt mit der Klasse Calculate. Fügen Sie der
> Klasse eine Methode
> 
> 
> ...


[/code]


----------



## mic_checker (28. Mrz 2005)

Naja, bei dieser Aufgabenstellung ist es nicht verwunderlich das du nach dem kleinsten gemeinsamen Teiler fragst 

Was ist das für ein Buch?

Also ich würd sagen es ist entweder der ggT oder der kGV gemeint... Steht nichts irgendwo davon das er sowas meint?


----------



## Hansdampf (28. Mrz 2005)

kleinster gemeinsamer Teiler ist meiner Meinung nach Schwachsinn. Vielleicht meinen die auch "echten Teiler", dann wär die 1 nicht dabei. 
Schmeiß das Buch weg.
Falls du Java lernen willst, klick http://www.boku.ac.at/javaeinf is ganz gut.


----------



## dklueh (28. Mrz 2005)

Was würdet ihr denn sagen? Ist denn hier ein kgV gefragt? Kann man den Euklid so implementieren?


----------



## dklueh (28. Mrz 2005)

Ach so, was ich vergessen habe:
Kann man bei folgendem Code 

```
public static long euklid(long a,long b) 
{ 
  long ggt,kgv; 
  if (a>b){long h=a;a=b;b=h;} 
  long r; 
  while (a>0) {r=b%a; b=a; a=r;} 
  ggt=b; 
  kgv=(a*b)/ggt; 
return kgv;  
//p("ggt:"+ggt+"  kgv:"+kgv); 
}
```
auch noch mit 
	
	
	
	





```
public int lcd(int a, int b)
```
 arbeiten? Oder müsste man dort dann das int trotzdem durch den Typ long ersetzen?
 :?:


----------



## Wildcard (28. Mrz 2005)

Andersrum würde es funktionieren, aber man kann keinen long wert einem int paramter übergeben, da eventuell Stellen verloren gehen würden. Du kannst die Methode aber auch einfach überladen wenn du mit long und int Werten arbeiten willst.


----------



## dklueh (28. Mrz 2005)

Also wäre dass dann so korrekt?


```
public long lcd(int a, int b)
{ 
  long ggt,kgv; 
  if (a>b){long h=a;a=b;b=h;} 
  long r; 
  while (a>0) {r=b%a; b=a; a=r;} 
  ggt=b; 
  kgv=(a*b)/ggt; 
return kgv;  

}
```

Woher kommt denn überhaupt die Variable "h"? :?:


----------



## Wildcard (28. Mrz 2005)

Nein, das ist nicht korrekt! Java ist streng typisiert, du kannst eine Variable niemals eine Zahl mit niedrigerer Genauigkeit zuweisen ohne expliziten Cast! Andersrum geht das.


			
				dklueh hat gesagt.:
			
		

> Woher kommt denn überhaupt die Variable "h"?


Das ist nur ein Zwischenspeicher


----------



## Hansdampf (28. Mrz 2005)

h ist nur ein Platzhalter, um die 2 anderen Variablen auszutauschen *swap*


----------



## dklueh (28. Mrz 2005)

Also müsste ich das int jeweiols durch einen Typ long ersetzen? Oder ist dann noch mehr falsch?
 :roll:


----------



## Wildcard (28. Mrz 2005)

Entweder das, oder casten. Durch long ersetzen ist aber besser.


----------



## dklueh (28. Mrz 2005)

Also, so wäre der Code richtig?


```
public long lcd(long a, long b) 
{ 
  long ggt,kgv; 
  if (a>b){long h=a;a=b;b=h;} 
  long r; 
  while (a>0) {r=b%a; b=a; a=r;} 
  ggt=b; 
  kgv=(a*b)/ggt; 
return kgv;  

}
```

Was genau bedeutet denn dann dieses lcd?


----------



## Wildcard (28. Mrz 2005)

lcd ist lediglich der Name der Methode. Das solltest du aber eigentlich selbst wissen!?  :roll:


----------



## dklueh (28. Mrz 2005)

Das habe ich mir schon gedacht...aber ich war mir da nicht sicher...war eben ein vorgegebener Austausch...

Aber sonst ist der Code nun ok, ja?


----------



## Wildcard (28. Mrz 2005)

warum versuchst du's nicht einfach


----------



## dklueh (28. Mrz 2005)

Bekomme immer die Fehlermeldung "class or interface expected"...
Lässt sich nicht compilieren...


----------



## Wildcard (28. Mrz 2005)

Du hast aber schon eine Klasse ausenrum gemacht???


----------



## mic_checker (28. Mrz 2005)

Kontrollier auch mal die Klammersetzung...


----------



## dklueh (28. Mrz 2005)

Schön...nu gehts...

Nächstes Problem:
Wie bekommt denn nun folgenden Zusatz in den Code?
Fügen Sie dem Projekt eine Testklasse hinzu, die die Korrektheit ihrer 
Methode für folgende Eingaben zeigt:

   a  | b
   ---+--
   4  | 8
   6  | 22
   13 | 9
   30 | 7
   0  | 8
   -4 | 14
   8  | 0
   3  | -3

Wie bitte erzeugt man eine Testklasse mit den Zahlen?


----------



## mic_checker (28. Mrz 2005)

Bisher hast du das ganze in ner Klasse "Calculate" oder?

Wie sieht dein kompletter Code aus?

Schreib dir halt ne eigene Klasse in der du ein Objekt der Klasse erzeugst und dann die Methode mit den oben genannten Werten aufrufst.


----------



## dklueh (28. Mrz 2005)

Richtig...alles in der Klasse Calculate_1...

Der Code sieht bisher so aus:

```
/**
 * Write a description of class calculate here.
 * 
 * @author (your name) 
 * @version (a version number or a date)
 */
public class calculate
{
public long lcd(long a, long b) 
{ 
// long statt int
  long ggt,kgv; 
  if (a>b){long h=a;a=b;b=h;} 
  long r; 
// lokal
  while (a>0) {r=b%a; b=a; a=r;} 
  ggt=b; 
  kgv=(a*b)/ggt; 
return kgv;  

} 

}
```

Könntest Du mir für einen Zahlenwert hier mal ein Bsp posten, wie das aussehen muss, damit ich die Werte anzeigt? Wäre super...


----------



## mic_checker (28. Mrz 2005)

Hab gedacht das sei:
http://www.java-forum.org/de/viewtopic.php?t=15801&start=15

da schon geklärt ?

Wenn du es ausgeben willst, ganz normal mit System.out...:

```
System.out.println(c.lcd(4,8));
```

Ansonsten wurd wohl schon alles gepostet.


----------



## dklueh (28. Mrz 2005)

'tschuldigung!
Ich bin nach einem Tag Java-Lernen schon so verwirrt, dass ich die Postings verwechselt habe! SORRY!

Also, nochmal:
Ich bitte Dich, mir ein Bsp. zu posten, wie man folgende Werte 
 | b 
---+-- 
4 | 8 
6 | 22 
13 | 9 
30 | 7 
0 | 8 
-4 | 14 
8 | 0 
3 | -3 

in eine Testklasse pakt und in den Code integriert:


```
public class calculate 
{ 
public long lcd(long a, long b) 
{ 
// long statt int 
  long ggt,kgv; 
  if (a>b){long h=a;a=b;b=h;} 
  long r; 
// lokal 
  while (a>0) {r=b%a; b=a; a=r;} 
  ggt=b; 
  kgv=(a*b)/ggt; 
return kgv;  

} 

}
```

Es soll damit geprüft werden, ob die Methoden korrekt sind. Leider versteh ich nicht, wie man das mit der Testklasse machen muss...


----------



## mic_checker (28. Mrz 2005)

```
public class CalcTest {
	public static void main(String[] args) {
		Calculate c = new Calculate();
		System.out.println(c.lcd(6,22));
	}	
   
	public long lcd(long a, long b) {
		// long statt int
  		long ggt,kgv;
  		if (a>b) {
		  long h=a;a=b;b=h;
		}
  		
		long r;
		
		// lokal
  		while (a>0) {
		  r=b%a; b=a; a=r;
		}
  	
	  	ggt=b;
  		kgv=(a*b)/ggt;
		return kgv; 
	} 
}
```

Hab die Methode so übernommen, ka ob die richtig ist....

Hab deine KLasse noch umbenannt in Calculate !


----------



## dklueh (28. Mrz 2005)

Ahhh...nu habe ich das kapiert!

Vielen Dank für Deine Hilfe!!!!  :toll:


----------



## mic_checker (29. Mrz 2005)

arg, hab gerad gesehen das ich ausversehen die Methode mit in die Testklasse reinkopiert hab. Wenn du ne extra Testklasse schreibst ist das nicht notwendig, das ist wohl noch vom andern Ansatz da reingeraten 

DU musst nur den main Teil beachten, der Rest gehört da eigentlich nicht mehr hin, da er ja schon in Calculate steht.

edit: Häckchen nicht vergessen


----------

