Kleinster gemeinsamer Teiler

Status
Nicht offen für weitere Antworten.

dklueh

Mitglied
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:


Code:
{ 
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
Code:
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

Top Contributor
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:

Code:
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:

Code:
int ret = lcd(ersteZahl,zweiteZahl);

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

bygones

Gast
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

Top Contributor
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 ;)
 
G

Guest

Gast
Hmm...werd das gleich mal ausprobieren!

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

mic_checker

Top Contributor
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

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

Hansdampf

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

Code:
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

Top Contributor
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

Bekanntes Mitglied
stimmt, aber das ist allgemein unnötig, bei solchen Methoden eine Klasse drumrum zu bauen, es wird ja kein innerer Zustand verwaltet.
kgV:
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);
}
 

dklueh

Mitglied
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:
public int lcd(int a, int b)
, die aus den Parametern den
kleinsten gemeinsamen Teiler errechnet. Vergessen Sie nicht, unzulässige Werte
anzufangen!
[/code]
 

mic_checker

Top Contributor
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?
 

dklueh

Mitglied
Ach so, was ich vergessen habe:
Kann man bei folgendem Code
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
Code:
public int lcd(int a, int b)
arbeiten? Oder müsste man dort dann das int trotzdem durch den Typ long ersetzen?
:?:
 

Wildcard

Top Contributor
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

Mitglied
Also wäre dass dann so korrekt?

Code:
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

Top Contributor
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
 

dklueh

Mitglied
Also, so wäre der Code richtig?

Code:
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?
 

dklueh

Mitglied
:D 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?
 

dklueh

Mitglied
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

Top Contributor
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

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

Der Code sieht bisher so aus:
Code:
/**
 * 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...
 

dklueh

Mitglied
'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:

Code:
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

Top Contributor
Code:
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 !
 

mic_checker

Top Contributor
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 ;)
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben