Methoden Methode istDurchZahlTeilbar schreiben

chrisööö

Mitglied
Hallo,
ich habe hier folgende Aufgabe:

Es sollte eine Methode istDurchZiffernTeilbar realisiert werden ohne
if-Anweisung und Schleifen. Die Methode sollte true übergeben, wenn
die Zahl, die an die Methode übergeben wurde 0 ist oder sie durch alle
ihre Ziffern teilbar ist. Also 312 oder 3102 würde true zurückgeben, da
312 durch 3, 1 und 2 teilbar ist, ebenso 3102. Bei 525 würde false
zurückgegeben, da 525 nicht durch 2 teilbar ist. Es durften zusätzliche
Methoden impementiert werden.
Public stativ boolean istDurchZiffenTeilbar(int zahl){
…}

Irgendwie komme ich auf keine Lösung.
Meine Anfänge scheitern alle früher oder später.

Was ich bis jetzt hatte ist:

Java:
public static boolean istDurchZahlTeilbar(int zahl) {
return (zahl == 0)? true : ((zahl/ ermittelTeiler(zahl))%2 == 1)? false : istDurchZahlTeilbar(Zahl/10);

Java:
public static int ermittelTeiler(int zahl) {
return zahl%10;

Irgendwie bis jetzt alles Murks -.-
 

Michael...

Top Contributor
Ohne Schleifen? Dann bleibt nur Rekursion.

Ich würde ersteinmal damit anfangen die Zahl rekursiv in ihre einzelnen Ziffern zu zerlegen und im zweiten Schritt die Teilbarkeit prüfen.

Edit: Wobei man dann aber nicht ohne Überprüfung einer Bedingung auskommt?? Die Aufgabenstellung lautet echt ohne Schleifen und Bedingungsabfragen??
 
Zuletzt bearbeitet:

bERt0r

Top Contributor
Lustige Aufgabenstellung, sag deinem Prof dass
(zahl == 0)? true : ((zahl/ ermittelTeiler(zahl))%2 == 1)? false : istDurchZahlTeilbar(Zahl/10)
das gleiche wie eine If Anweisung ist, nur auf unleselich.

Ausserdem 155/10 = 15,5; 155%10 = 5
 

Monaria

Aktives Mitglied
Spontan und nur minimal getestet :

Java:
public class DurchNummernTeilbar{
	
	public static void main(String[] args){
		System.out.println(isDurchZiffernTeilbar(250));
	}
	
	private static boolean isDurchZiffernTeilbar(int n){
		return((n == 0 ) || 
                (
                doesNotContainZero(n)
		&& ((n % 2 == 0) || !contains(n, 2))
		&& ((n % 3 == 0) || !contains(n, 3))
		&& ((n % 4 == 0) || !contains(n, 4))
		&& ((n % 5 == 0) || !contains(n, 5))
		&& ((n % 6 == 0) || !contains(n, 6))
		&& ((n % 7 == 0) || !contains(n, 7))
		&& ((n % 8 == 0) || !contains(n, 8))
		&& ((n % 9 == 0) || !contains(n, 9))
                ));
	}
	
	private static boolean contains(int n, int i){
		return String.valueOf(n).contains(String.valueOf(i));
	}
	private static boolean doesNotContainZero(int i){
		return !(String.valueOf(i).contains("0") && String.valueOf(i).length() > 1);
	}
}
 
Zuletzt bearbeitet:

chrisööö

Mitglied
Ja die soll nur mit Rekursion gelöst werden. Das ist ja die Schwierigkeit bei der Aufgabe. Mit Schleifen hätte ich die Lösung ja -.-

Mein Problem ist die Uhrsprüngliche Zahl durch alle ihre einzelnen Zahlen zu Teilen (mittels Rekursion).
Ich finde da einfach keine Lösung.
 
G

Gonzo17

Gast
Soll 3102 tatsächlich auch gelten? Da ist nämlich die 0 enthalten und durch 0 teilen ist ja eigentlich nicht so dolle.

Ansonsten ist das, was du da machst auch nichts anderes als ein if, glaube nicht, dass das so gedacht war. Stattdessen würde ich zB eine Methode schreiben istNull(char), die einene einzelne Ziffer auf 0 prüft =>
Code:
return c=='0';
 

chrisööö

Mitglied
Ich habe eine ähnliche Aufgabe schonmal gelöst. Allerdings wurden dort die Intervalle der Teile mit übergeben. Bei der aktuellen muss ich diese ja selber aus der Zahl ermitteln. Das ist mein Problem. Hier mal die andere bereits gelöste Aufgabe:

Java:
public static boolean hatTeiler2(int zahl, int intervallVon, int intervallBis) {
        return (zahl%intervallVon==0)?
            true : (intervallVon == intervallBis)?
                false : hatTeiler2(zahl, intervallVon+1, intervallBis);
    }
 
B

bone2

Gast
wie wäre es mit durch 10 teilen? wenn das ergebnis >0 ist, rufst du dich selber nochmal auf, wenn nicht bearbeitest du den rest
so würdest du an jede einzelne ziffer rankommen
 

RySa

Bekanntes Mitglied
Also irgendwie ist da was falsch verstanden/interpretiert worden. Du sagtest es solllen keine If-Anweisungen genutzt werden. Und was ist das denn bitte schön ?:
Java:
        return (zahl%intervallVon==0)?
            true : (intervallVon == intervallBis)?
                false : hatTeiler2(zahl, intervallVon+1, intervallBis);
für mich ist das nur eine andere (schlecht zu lesende) Schreibweise von:
Java:
if (zahl % intervallVon == 0){
 return intervallVon == intervallBis;
}
else {
return hatTeiler2(zahl,intervallVon+1, intervallBis);
}
Oder etwa nicht ?
 
Zuletzt bearbeitet:

RySa

Bekanntes Mitglied
Das ist doch genau die selbe if-Anweisung. Rekursion hat da mit der Schreibweise nichts zu tun, mein Beispiel ist genauso rekursiv wie deins. Und dein Beispiel beinhaltet die selbe If-Anweisung wie meins, nur halt anders geschrieben (in anderem Format ? ).

Deswegen verstehe ich nicht ganz, wie das ohne If's umgesetzt werden sollte...
 

chrisööö

Mitglied
Steht doch dort. Ohne If bedeutet nur mit Operatorsymbolen ?:

Ganz klar oder?

Wenn du das ganze mit If lösen kannst ist mir das auch recht. Dann forme ich das selber um. Allerdings würde mir auch eine If Schreibweise jetzt keine Lösung bieten -.-
 

RySa

Bekanntes Mitglied
So spontan, ohne große Tests, vielleicht so etwas:
Java:
public class Rekursion {

	public static boolean isZahlTeilbar(int zahl, int marker){
		String[] s = (""+zahl).split("");
		try {
			if (zahl % Integer.valueOf(s[marker]).intValue() == 0){
				return isZahlTeilbar(zahl,marker+1);
			}
			else {
				return false;
			}
		}
		catch(ArrayIndexOutOfBoundsException ex){
			return true;
		}
                catch(ArithmeticException ex){
			return false;
		}

		
	}
	
	
	public static void main(String agrs[]){
		System.out.println(isZahlTeilbar(312,1));
	}
}

Als marker immer eine 1 am Anfang übergeben (hatte keine andere Idee ^^) - hatte nie zuvor Rekursion angewendet :p

Soll 3102 tatsächlich auch gelten? Da ist nämlich die 0 enthalten und durch 0 teilen ist ja eigentlich nicht so dolle.
Hier schließe ich mich dem Gonzo17 an, daher das return false bei ArithmeticException
 
Zuletzt bearbeitet:

chrisööö

Mitglied
Problem ist, dass der Methode ausser der "Zahl" nichts übergeben werden darf. Also kein Marker.
Ebenfalls keine anderen Methoden wie valueof etc. Andere Methoden selber schreiben ist erlaubt, allerdings wiederum ohne Hilfe vorgefertigter anderer Methoden.
Es muss dafür eine Elegante Lösung geben, die mir aber einfach nicht einfallen will.
 

RySa

Bekanntes Mitglied
Vielleicht soll auch die Benutzung der Variablen verboten werden ? Also wenn ich sage, mach mir ein Spiegelei, du darfst dafür aber keine Eier nutzen, wird das nichts....split() und valueOf() sind standard-Methoden von String, und da sehe ich es nicht ein, dass sie nicht benutzt werden dürfen o_O Soll ich sie jetzt selber mal als Code bei mir einfügen damit ich die benutzen kann ? Wo bleibt die Logik ? Das ist das gleiche als ob dir Verboten wäre Rechenoperationen zu benutzen "weil sie vorgefertigt sind"...Jedenfalls ist meiner Meinung nach diese Lösung in Ordnung:
Java:
public class Rekursion {

	public static boolean isZahlTeilbar(int zahl) {
		return checkTeiler(zahl, 1);
	}

	public static boolean checkTeiler(int zahl, int marker) {
		String[] s = ("" + zahl).split("");
		try {
			if (zahl % Integer.valueOf(s[marker]).intValue() == 0) {
				return checkTeiler(zahl, marker + 1);
			} else {
				return false;
			}
		} catch (ArrayIndexOutOfBoundsException ex) {
			return true;
		} catch (ArithmeticException ex) {
			return false;
		}
	}

	public static void main(String agrs[]) {
		System.out.println(isZahlTeilbar(312));
	}
}

Du musst dann nur die If's, umformen (ich benutze diese 2. Variante nie, deswegen überlasse ich es dir ^^)
 
Zuletzt bearbeitet:

Mofi

Bekanntes Mitglied
Vielleicht soll auch die Benutzung der Variablen verboten werden ? Also wenn ich sage, mach mir ein Spiegelei, du darf dafür aber keine Eier nutzen, wird das nichts....split() und valueOf() sind standard-Methoden von String, und da sehe ich es nicht ein, dass sie nicht benutzt werden dürfen o_O Soll ich sie jetzt selber mal als Code bei mir einfügen damit ich die benutzen kann ? Wo bleibt die Logik ? Das ist das gleiche als ob dir Verboten wäre Rechenoperationen zu benutzen "weil sie vorgefertigt sind"...Jedenfalls ist meiner Meinung nach diese Lösung in Ordnung:

Ich find die Aufgabenstellung ansich schon total daneben...
Ich mein, dass man keine Schleifen verwenden soll...OK
Aber man soll keine if-Verzweigung benutzen, aber darf den ?: Operator benutzen (hab den Namen vergessen...Irgendwas mit ter...tertiärer?) Ich mein das ergibt nichtmal Ansatzweise Sinn.
Das man scheinbar dann auch Standardmethoden nicht benutzen darf ergibt in der Aufgabenlogik dann eventuell schon mehr Sinn (Konsequenz und so...)

Mir raucht grad der Kopf, daher hab ich mir deine Lösung nicht weiter angeschaut und hab meine eigene auch wieder Verworfen...Krieg heut kaum was auf die Reihe....


(Und nein es ist in meinen Augen NICHT logisch, wenn da steht "benutze keine if-Verzweigung" das man dann den ?: benutzen darf...Wäre mir nie in den Sinn gekommen)
 
N

nillehammer

Gast
Ich hab mir mal ein paar Gedanken gemacht. Dabei ist folgendes Rausgekommen:
[Java]
public final class Experiment {

public static void main(final String[] args) {

final int zahl = 1124;

/*
* Mit Math.abs sorgen wir dafür, dass der Algorithmus eine positive
* Zahl bekommt, weil Modulo mit negativen Zahlen nicht funktioniert.
*/

final int positiveZahl = Math.abs(zahl);
/*
* Durch die Verwendung des absteigend sortierten Sets (new
* TreeSet<Integer>( Collections.reverseOrder()), werden zwei Optimierungen
* vorgenommen: 1. Doppelt vorkommende Ziffern werden eliminiert. Damit
* werden Doppelprüfungen vermieden 2. Die Wahrscheinlichkeit, dass eine
* Zahl durch eine große Ziffer NICHT teilbar ist, ist größer als bei
* kleineren. Dadurch wird bei der rekursiven Prüfung der Teilbarkeit ggf.
* die Abbruchbedingung schneller erreicht. Durch die absteigende Sortierung
* werden die großen Ziffern zuerst geprüft.
*/
final SortedSet<Integer> ziffern = doZerlegung(new TreeSet<Integer>(
Collections.reverseOrder()), positiveZahl);

/*
* Durch 0 kann nicht dividiert werden, deswegen aus der Menge zu prüfender
* Ziffern entfernen.
*/
ziffern.remove(0);

/*
* Jede Zahl ist durch 1 teilbar. Eine Prüfung macht keinen Sinn, also
* entfernen.
*/
ziffern.remove(1);

System.out.println(istDurchAlleZiffernTeilbar(ziffern.iterator(),
positiveZahl));

}

/**
* Zerlegt eine Zahl in ihre Ziffern und gibt das Ergebnis in einem
* {@link SortedSet} zurück.
*
* @param input
* das {@link SortedSet}, in dem das Ergebnis der Zerlegung
* gespeichert werden soll, darf nicht null sein
* @param positiveZahl
* die Zahl, die zerlegt werden soll, muss positiv sein
* @return ein {@link SortedSet}, dass die Ziffern enthält, aus der die Zahl
* besteht
*/
public static final SortedSet<Integer> doZerlegung(
final SortedSet<Integer> input, int positiveZahl) {

input.add(positiveZahl % 10);

positiveZahl /= 10;

return positiveZahl > 0 ? doZerlegung(input, positiveZahl) : input;
}

public static boolean istDurchAlleZiffernTeilbar(
final Iterator<Integer> ziffernIterator, final int zahl) {

/*
* Wenn ziffernIterator.hasNext() == true, müssen wir zunächst die
* Teilbarkeit durch die aktuelle Ziffer prüfen.
*
* ((zahl % ziffernIterator.next() == 0))
*
* Ergibt dies false, geben wir das direkt zurück (Abbruchbedingung). Wir
* nutzen hier die Funktionalität des Shortcuts "&&". Dieses wertet den
* zweiten Teil der Bedingung garnicht mehr aus, wenn der erste schon false
* ist.
*
* Ergibt diese allerdings true, müssen wir mit der nächsten Ziffer weiter
* machen.
*
* Wenn ziffernIterator.hasNext() == false, haben wir alle Ziffern
* durchgeprüft. Also können wir true zurück geben
*/
return ziffernIterator.hasNext() ? (zahl % ziffernIterator.next() == 0)
&& istDurchAlleZiffernTeilbar(ziffernIterator, zahl) : true;
}

}
[/code]
Vorteile:
-Auf die Zerlegung der Zahl in Strings zur Ziffernermittlung wird verzichtet.
-Doppelt vorkommende Ziffern werden nur einmal geprüft
-Die Prüfung auf Teilbarkeit durch 1 (immer wahr) und 0 (nicht möglich) wird vermieden.
-Große Ziffern werden zuerst geprüft, weil hier die Wahrscheinlichkeit größer ist, dass die Teilbarkeitsprüfung negativ ausfällt und somit die Abbruchbedingung der Rekursion erreicht wird.

Gruß nillehammer
 
Zuletzt bearbeitet von einem Moderator:

chrisööö

Mitglied
Ich find die Aufgabenstellung ansich schon total daneben...
Ich mein, dass man keine Schleifen verwenden soll...OK
Aber man soll keine if-Verzweigung benutzen, aber darf den ?: Operator benutzen (hab den Namen vergessen...Irgendwas mit ter...tertiärer?) Ich mein das ergibt nichtmal Ansatzweise Sinn.
Das man scheinbar dann auch Standardmethoden nicht benutzen darf ergibt in der Aufgabenlogik dann eventuell schon mehr Sinn (Konsequenz und so...)

Mir raucht grad der Kopf, daher hab ich mir deine Lösung nicht weiter angeschaut und hab meine eigene auch wieder Verworfen...Krieg heut kaum was auf die Reihe....


(Und nein es ist in meinen Augen NICHT logisch, wenn da steht "benutze keine if-Verzweigung" das man dann den ?: benutzen darf...Wäre mir nie in den Sinn gekommen)

An der Aufgabenstellung kann ich nunmal auch nichts ändern. Allerdings geht es mir heute genauso das ich das einfach nicht hin bekomme und jeden Ansatz wieder verwerfen muss -.-
 

Sonecc

Gesperrter Benutzer
Man kann über die Aufgabenstellung soviel mosern wie man will, aber sie ist nunmal gegeben.
Ich vermute mal ganz stark, dass sein Professor damit das abstrakte Denken und erarbeiten einer Lösung trainieren will.
In der Uni ist nicht jede Aufgabe wirklich sinnvoll und völlig Diskussionsfrei.
Warum Rysa sich da aber dermaßen drüber aufregen muss ist mir schleierhaft.

Was aber die Problematik mit der Verwendung von If betrifft:
Der Ternäre Operator ist per Definition ein Inline - If und damit meiner Meinung nach eigentlich ebenfalls verboten.
Nicht verboten sollte aber etwas sein wie:

Java:
return a > 0

Edit: Muss aber zugeben, ohne If ist es recht schwer eine Abbruchbedingung für die Rekursionen zu definieren.
 
Zuletzt bearbeitet:

RySa

Bekanntes Mitglied
Also ich meine, dass meine Lösung funktioniert. Wenn du aber schon Methoden wie split() und valueOf nicht benutzen darfst, dann wünsche ich dir viel Glück bei der Aufgabe. Überlege es dir vielleicht, ob 10 Jahre im Knast, für den Mord an deinem Prof. dir nicht kürzer kommen, als die Zeit die du für diese Aufgabe benötigen wirst :p Aber jetzt ernst. Wieso zum Henker sollte man solche Methoden nicht nutzen können. Dann kannst du direkt "Kodierer" werden, und mit 0 und 1 arbeiten, wenn du vorgefertigtes Zeug nicht benutzen darfst. Das Rad immer wieder Neuerfinden ist einfach Sinnlos. Auch wenn du diese Aufgabe "beweltigst", wird es dir nicht weiterhelfen, da du im Normalfall, die Methoden nutzen würdest, anstatt sie neu zu schreiben.

Ein typisches Beispiel, wie die Unis Unnützes Wissen "beibringen".
 
Zuletzt bearbeitet:
N

nillehammer

Gast
Nochwas zu meinem Lösungsvorschlat (4 Posts weiter unten). Wenn der ternäre Operator (? : ) nicht erlaubt ist, sag Bescheid. Dann muss man mit geschickten Shortcuts durch && arbeiten. Wenn SortedSets nicht erlaubt sind, geht auch. Dann ist der Algorithmus allerdings nicht mehr optimiert.
 

RySa

Bekanntes Mitglied
@ nillehammer

Ich würde eher vermuten, dass das alles nicht erlaubt ist:

Math.abs(zahl), Collections.reverseOrder(), ziffern.remove(0), ziffern.iterator(), input.add(positiveZahl % 10), ziffernIterator.next()

Weil es schon vorgefertigte Methoden sind.



Also hier nochmal mit dem Ternären Operator:
Java:
public class Rekursion {
 
    public static boolean isZahlTeilbar(int zahl) {
        return checkTeiler(zahl, 1);
    }
 
    public static boolean checkTeiler(int zahl, int marker) {
        String[] s = ("" + zahl).split("");
        try {
            boolean b = (zahl % Integer.valueOf(s[marker]).intValue() == 0) ? checkTeiler(zahl, marker + 1) : false;
            return b;
        } catch (ArrayIndexOutOfBoundsException ex) {
            return true;
        } catch (ArithmeticException ex) {
            return false;
        }
    }
    
    
 
    public static void main(String agrs[]) {
        System.out.println(isZahlTeilbar(31062));
    }
}

Bis auf das split() und valueOf() ist glaube ich alles ok. Anders werde ich es nicht lösen können. Viel Glück bei weiteren Versuchen :)
 
Zuletzt bearbeitet:

bERt0r

Top Contributor
Etwas in der Richtung?

Java:
static boolean istTeilbar(int zahl)
	{
		return teile(zahl,zahl);	
	}
	
	static boolean teile(int zahl,int zahl2)
	{
		System.out.println(zahl+" "+zahl2);
		int ziffer=zahl2%10;
		ziffer=(ziffer==0)?1:ziffer;
		boolean teilt=(zahl%ziffer==0);
		boolean done=(zahl2==0);
		return (done)?true:(teilt)?teile(zahl,zahl2/10):false;
	}
	
	public static void main(String args[])
	{
		System.out.println(istTeilbar(3103));
	}
 

xehpuk

Top Contributor
Ich werfe auch mal eine Lösung in den Raum, die das Ganze in ein paar Teilprobleme aufteilt.
Java:
public class ZahlZiffernTest {
	public final static int BASIS = 10;

	/**
	 * Überprüft, ob die Zahl durch all ihre Ziffern teilbar ist.
	 */
	public static boolean istDurchZiffernTeilbar(int zahl) {
		return istDurchZiffernTeilbarAb(zahl, 0);
	}

	/**
	 * Überprüft ab dem angegebenen Index aufwärts (nach links), ob die Zahl durch alle Ziffern teilbar ist.
	 */
	private static boolean istDurchZiffernTeilbarAb(int zahl, int index) {
		return index >= anzahlZiffern(zahl) || istDurchZifferTeilbar(zahl, index) && istDurchZifferTeilbar(zahl, index + 1);
	}

	/**
	 * Überprüft, ob die Zahl durch die Ziffer beim angegebenen Index (von rechts) teilbar ist.
	 */
	private static boolean istDurchZifferTeilbar(int zahl, int index) {
		return istTeilbarDurch(zahl, gibZiffer(zahl, index));
	}

	/**
	 * Überprüft, ob Divisor ein ganzzahliger Teiler von Dividend ist. Gibt auch true zurück, wenn Divisor == 0.
	 */
	private static boolean istTeilbarDurch(int dividend, int divisor) {
		return divisor == 0 || dividend % divisor == 0;
	}

	/**
	 * Gibt die Ziffer der Zahl beim angegebenen Index (von rechts) wieder. 0, wenn Index >= Anzahl der Ziffern.
	 */
	private static int gibZiffer(int zahl, int index) {
		return (zahl / potenz(BASIS, index)) % BASIS;
	}

	/**
	 * Gibt basis^exponent zurück.
	 */
	private static int potenz(int basis, int exponent) {
		return exponent <= 0 ? 1 : basis * potenz(basis, exponent - 1);
	}

	/**
	 * Gibt die Anzahl der Ziffern dieser Zahl zurück.
	 */
	public static int anzahlZiffern(int zahl) {
		return zahl < BASIS ? 1 : 1 + anzahlZiffern(zahl / BASIS);
	}

	public static void main(String[] args) {
		int[] zahlen = { 3102, 312, 525 };
		for (int n : zahlen)
			System.out.println(String.valueOf(n) + ": " + istDurchZiffernTeilbar(n));
	}
}
 

RySa

Bekanntes Mitglied
@xehpuk

Ganz schön aufwendig ^^ Wenns funktioniert, dann könnte es die vom TO gesuchte Lösung sogar sein :p Bis auf das letzte:
Java:
String.valueOf(n)

Da würd glaub' ich sein Prof. meckern (nicht deine Methode)^^ vielleicht lieber doch
Java:
""+n
:)
 

parabool

Bekanntes Mitglied
Java:
public class Test {
	
	public static void main(String[] args) {
			
		System.out.println("ist Teilbar="+isT(312,0));		
	}
	private static boolean isT(int z,int i)
	{					
		int t = Character.getNumericValue(String.valueOf(z).charAt(i));
		i++;	
		
		if(t==0)return false;			
		if(z%t!=0)return false;	
				
		if(i>String.valueOf(z).length()-1)return true;
		else return isT(z,i);			
	}
}
 
Zuletzt bearbeitet:
B

bone2

Gast
Also irgendwie ist da was falsch verstanden/interpretiert worden. Du sagtest es solllen keine If-Anweisungen genutzt werden. Und was ist das denn bitte schön ?:
Java:
        return (zahl%intervallVon==0)?
            true : (intervallVon == intervallBis)?
                false : hatTeiler2(zahl, intervallVon+1, intervallBis);
für mich ist das nur eine andere (schlecht zu lesende) Schreibweise von:
Java:
if (zahl % intervallVon == 0){
 return intervallVon == intervallBis;
}
else {
return hatTeiler2(zahl,intervallVon+1, intervallBis);
}
Oder etwa nicht ?

eher:
Java:
if (zahl%intervallVon==0) {
    return true;
}
else {
    if (intervallVon == intervallBis) {
        return false;
    }
    else {
        return hatTeiler2(zahl, intervallVon+1, intervallBis);
    }
}
 

RySa

Bekanntes Mitglied
Ja das ist mir dann im Laufe der Versuche auch bewusst geworden, dass es nicht so ganz gestimmt hat. Da wollte ich halt nur darauf hinaus, dass es genauso eine If-Anweisung ist, die schreibweise nur anders. Danke aber für die Korrektur :p
 

xehpuk

Top Contributor
Das
Code:
String.valueOf(n)
kann man ja auch weglassen, da danach konkateniert wird. Aber zu Testzwecken darf man ja wohl auch auf anderes zugreifen.
Wobei ich gerade sehe, dass bei mir noch nicht die letzte Ziffer richtig betrachtet wird …
Bei Zahlproblemen würde ich aber auch nicht den Weg über Strings gehen. Da macht man es sich zu einfach und um Einiges ineffizienter wirds wohl auch sein. :p
 

bERt0r

Top Contributor
Sry für den doppelpost, aber bevors untergeht:
Mein code funktioniert schon, aber die zahl 3103 die ich eingegeben habe ist eben nicht teilbar :p
 

xehpuk

Top Contributor
Okay, Fehler gefunden. Durch einen kleinen Schreibfehler hatte ich keine richtige Rekursion drin. Hier korrigiert ("istDurchZifferTeilbar" --> "istDurchZiffernTeilbarAb"):

[JAVA=14] private static boolean istDurchZiffernTeilbarAb(int zahl, int index) {
return index >= anzahlZiffern(zahl) || istDurchZifferTeilbar(zahl, index) && istDurchZiffernTeilbarAb(zahl, index + 1);
}[/code]
Diese Lösung ist dann mindestens 10-mal schneller als über Strings.
 

xehpuk

Top Contributor
Und die von bERt0r etwa nochmal dreimal schneller als meine. Ich wollte aber ohne Lokalvariablen auskommen. ;)

Ups, wollte ich eigentlich an den vorigen Beitrag raneditieren. Bitte mergen. :oops:
 

parabool

Bekanntes Mitglied
Ok, ohne If :

EDIT: Berücksichtigt wenn Eingabe = 0 -> true.

Java:
public class Test {
	
	public static void main(String[] args) {
			
		System.out.println("ist Teilbar="+isT(0,0,0));		
	}
	private static boolean isT(int z,int i,int ret)
	{					
		int t = 0;
		try
		{
		 t = Character.getNumericValue(String.valueOf(z).charAt(i));	
		 ret+=z%t;
		}
		catch(java.lang.ArithmeticException r)
		{
			return false || z==0;
		}	
		catch(StringIndexOutOfBoundsException r)
		{			
			
			return (ret==0);
		}	
		return isT(z,++i,ret);			
	}
}
 
Zuletzt bearbeitet:

Svente

Mitglied
Wie wäre es die Kurzschlussoperatoren zur Bedingungsüberprüfung zu "missbrauchen"?

Meine Lösung:

[Java]

public class Test {


public static boolean isDurchZahlTeilbar( int zahl){
return testeZiffern(zahl, zahl);
}


private static boolean testeZiffern(int restZiffern, int zahl){
int ziffer =restZiffern%10;

return restZiffern<10

||

((ziffer==0||(zahl%ziffer==0)) && testeZiffern(restZiffern/10, zahl));
}
}
[/code]
 
Zuletzt bearbeitet:

bERt0r

Top Contributor
Svente, bei deinem Code wird die erste Ziffer nicht mehr überprüft, also im fall von 5102, sagt er true.

Java:
private static boolean testeZiffern(int restZiffern, int zahl){
        int ziffer =restZiffern%10;
        System.out.println(restZiffern);
        return [B] restZiffern==0[/B] || ((ziffer==0||(zahl%ziffer==0)) && testeZiffern(restZiffern/10, zahl));
    }
So funktionierts, und das is ja dann quasi das gleiche wie meine Lösung
 

Svente

Mitglied
Stimmt, ansonsten bricht er einfach eine Rekusion zu früh ab.

Der Unterschied zu deiner Lösung sollte in der Vermeidung des ternärer Operator liegen. Die Idee war diesen durch den Kurzschluss der Vergleichoperatoren || bzw && und zu ersetzen .
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Verschiedene Optionen in der Methode Java Basics - Anfänger-Themen 6
T Rekursive Methode Java Basics - Anfänger-Themen 13
Ü Methode soll Quadrat aus der Summer zurückgeben Java Basics - Anfänger-Themen 10
P Objekt einer Methode eines anderen Objektes übergeben Java Basics - Anfänger-Themen 5
Leyla Spezifischte Methode Java Basics - Anfänger-Themen 16
M Methode zielnah zeigt das gewünschte Ausgabe nicht an Java Basics - Anfänger-Themen 3
L Variablenwerte aus einer Methode übergeben Java Basics - Anfänger-Themen 2
T Methode soll etwas ausrechnen und zurückgeben (klappt nd) hat wer eine Idee? Java Basics - Anfänger-Themen 11
P Main Methode scheint Constructor aufzurufen, ohne dass es so gecoded ist Java Basics - Anfänger-Themen 2
T Aufruf der Methode einer Oberklasse, wenn sie in der Unterklasse überschrieben ist. Polymorphie. Java Basics - Anfänger-Themen 2
C Zugriff auf Methode Java Basics - Anfänger-Themen 2
M Datentypen While-Schleife eine Java Methode erstellen Java Basics - Anfänger-Themen 3
T Methode akzeptiert String nicht Java Basics - Anfänger-Themen 18
M Methode sperren bis ein Kriterium erfüllt wurde Java Basics - Anfänger-Themen 3
D Switch Case Methode aufrufen Java Basics - Anfänger-Themen 3
C Unbekannte Methode add bei Klasse die JTree erweitert Java Basics - Anfänger-Themen 14
M methode aufrufen ohne parameter Java Basics - Anfänger-Themen 1
marcelnedza Finde meinen Fehler in einer Methode nicht, Java Karol Java Basics - Anfänger-Themen 15
monsterherz einfache Methode mit Fehler den ich nicht finde Java Basics - Anfänger-Themen 21
Ostkreuz Wieso wird die Methode nochmal aufgerufen? Java Basics - Anfänger-Themen 5
G Variable aktualisiert sich nicht in rekursiver Methode Java Basics - Anfänger-Themen 4
MoxMorris Wie macht man String[] = String[] aus einer anderer Methode? Java Basics - Anfänger-Themen 18
Say super.methode / super.variable und super(variable) Java Basics - Anfänger-Themen 2
B Wie kann ich folgende Klasse/Methode per Button ausführen? Java Basics - Anfänger-Themen 1
D Interface Methode wird ungewollt in der Subklasse überschrieben Java Basics - Anfänger-Themen 5
L Methoden Eine Methode um zu testen ob es ein Nachbar gibt Java Basics - Anfänger-Themen 10
til237 Iterative Methode in rekursive Methode umschreiben Java Basics - Anfänger-Themen 4
M Daten aus errechneter Methode in Datenbank(SQLite) schreiben Java Basics - Anfänger-Themen 60
D next() Methode mehrfach verwenden Java Basics - Anfänger-Themen 1
Ostkreuz Methoden Von Dezimal zu Hexadezimal Methode toHex Java Basics - Anfänger-Themen 2
I Entity Objekt nicht gefunden -> Webhook empfangen in der gleichen Methode (Transaktion) Java Basics - Anfänger-Themen 37
N Throw an Main Methode übergeben Java Basics - Anfänger-Themen 7
M Methoden Methode 'wiederhole' nicht gefunden (Uebersetzungsfehler) Java Basics - Anfänger-Themen 1
H Zu langen String aufteilen - bequeme Methode? Java Basics - Anfänger-Themen 14
_user_q Wie eine Methode/Funktion aus einer Klasse mit Constructor aufrufen? Java Basics - Anfänger-Themen 20
S Array mit Methode löschen Java Basics - Anfänger-Themen 2
J Java To String Methode, Array mit For-Schleife Java Basics - Anfänger-Themen 2
T Variable von Objekten in einer Methode überprüfen Java Basics - Anfänger-Themen 26
M Anzahl Kommandozeilenparamter mittels Methode Java Basics - Anfänger-Themen 11
D Methode: Array Reihenfolge tauschen Java Basics - Anfänger-Themen 3
julian0507 Array aus Methode in anderer Methode sichtbar machen Java Basics - Anfänger-Themen 10
frager2345 Problem mit Methode Java Basics - Anfänger-Themen 4
J Die statische Main-Methode ändert Instanzvariable? Java Basics - Anfänger-Themen 10
D Methode aus dem Aufrufer aufrufen Java Basics - Anfänger-Themen 1
T IOStreams read(byte[]b) methode Java Basics - Anfänger-Themen 2
frager2345 Java Singleton Muster -> Methode für Konstruktor mit Parametern Java Basics - Anfänger-Themen 3
U Beispiel Methode size() vom "Collection"-interface... Wie kann man sichtbar machen, was die Methode unter der Haube macht? Java Basics - Anfänger-Themen 8
D Warum kann ich hier nicht auf die Methode zugreifen? Java Basics - Anfänger-Themen 5
M generate Methode für Streams Java Basics - Anfänger-Themen 6
M Methoden Zweidimensionaler Array mit Setter Methode ändern Java Basics - Anfänger-Themen 4
I Optionaler Parameter bei Methode, der nur optional ist? Java Basics - Anfänger-Themen 6
berserkerdq2 Wozu benötigt man den BiPredicate, kann ich nicht einfach eine normale Methode nutzen, statt BiPredicate? Java Basics - Anfänger-Themen 3
T Linked List set-Methode Java Basics - Anfänger-Themen 2
D Arrays an replaceAll-Methode übergeben Java Basics - Anfänger-Themen 12
B Attribute eines Objekts einer Klasse durch statische Methode einer 2. Klasse ändern? Java Basics - Anfänger-Themen 32
berserkerdq2 Habe eine Klasse, welche public ist, diese hat eine public Methode, die nicht static ist. Wenn ich nun versuche aufzurufen Probleme? Java Basics - Anfänger-Themen 8
viktor1 Methoden Methode schreiben static void readText (String filename) {...} zu WordHistogramSample.java Java Basics - Anfänger-Themen 13
W Equals-Methode überschreiben bei composition Java Basics - Anfänger-Themen 20
V Hilfe bei Implementierung einer boolean Methode Java Basics - Anfänger-Themen 6
T Methode, die prüft ob in einem Int-Array maximal 2 Zahlen enthalten sind, die größer als ihr Vorgänger sind Java Basics - Anfänger-Themen 5
V Methoden printChar Methode mit Rückgabetyp void Java Basics - Anfänger-Themen 26
F Graph Tiefensuche Methode Java Basics - Anfänger-Themen 7
Jambolo Methode, welche die 3 letzten Parameter Werte speichert Java Basics - Anfänger-Themen 20
berserkerdq2 wie funktioniert contenthandler, was muss ich bei der Methode startElement und endElement tun? Java Basics - Anfänger-Themen 11
M Warum return die Methode den Wert nicht Java Basics - Anfänger-Themen 5
berserkerdq2 Wann soll ich den Stream schließen, wenn ich das in einer Methode habe? Java Basics - Anfänger-Themen 8
berserkerdq2 Ich gebe eine ArrayList als List zurück per MEthode, wie kann ich nun aber die ArrayList speichern? Java Basics - Anfänger-Themen 46
S Methode Java Basics - Anfänger-Themen 4
M Eine Methode die erkennt ob die ein gegebene zahl größer oder kleiner sein muss Java Basics - Anfänger-Themen 2
U Methode wird genutzt, ohne dass ich die aufrufe? Java Basics - Anfänger-Themen 4
F nach Methode Programm nicht beenden Java Basics - Anfänger-Themen 9
Liroyd Methode mit Objektvariabel rechnen? Java Basics - Anfänger-Themen 6
H Mit setter-Methode JLabel in einer andern Klasse ändern. Java Basics - Anfänger-Themen 40
D Methode um mögliche Rezepte auszugeben Java Basics - Anfänger-Themen 12
U Warum kann ich die Methode in der ENUM Klasse nicht aufrufen? Und warum geht die Switch nicht? Java Basics - Anfänger-Themen 8
J Hallo zusammen , was macht diese Methode hier genau? Java Basics - Anfänger-Themen 3
D Array in Main Methode aus anderer Klasse aufrufen Java Basics - Anfänger-Themen 3
H Eine Methode über Actionlistener beenden Java Basics - Anfänger-Themen 8
G jButton führt Main Methode nicht richtig aus Java Basics - Anfänger-Themen 3
G Main Methode wird beim ersten Aufruf nicht richtig ausgeführt Java Basics - Anfänger-Themen 1
C60 Methoden Main-Methode erkennt meine Arrays nicht. Java Basics - Anfänger-Themen 7
A Ein Array bearbeiten und in einer anderen Methode nutzen Java Basics - Anfänger-Themen 6
A Ergebnis einer Methode bei einer anderen verwenden Java Basics - Anfänger-Themen 13
L Iteratorform und Methode mit variabler Parameterzahl Java Basics - Anfänger-Themen 31
F Methode ArrayList mit Eingabewert Java Basics - Anfänger-Themen 2
M Wie kann eine Methode für ein vorhandenes "Array von char" einen Index-Wert zurückliefern? Java Basics - Anfänger-Themen 3
M Wie kann die Implementation einer Methode den Wert eines Attributs vermindern? Java Basics - Anfänger-Themen 3
Csircc Rekursive Methode Stack Overflow Java Basics - Anfänger-Themen 10
M Wie kann eine Methode (string) eine andere Methode (void) mit zufälligen int-Werten aufrufen? Java Basics - Anfänger-Themen 4
M Wie verknüpfe ich eine Bedingung mit einer Methode ohne if-Verzweigung & Bedingungsoperator? Java Basics - Anfänger-Themen 2
M Wie kann eine Methode eine andere Methode um Werte wie z.B. 1 erhöhen? Java Basics - Anfänger-Themen 6
schredder Strings und reguläre Ausdrücke - Methode mit return string.matches Java Basics - Anfänger-Themen 5
D mehrere Berechnungen in einer Methode Java Basics - Anfänger-Themen 9
H String Repräsentation eines Rechtecks mit Instanz-Methode Java Basics - Anfänger-Themen 8
M Wie kann ich eine Methode aus einem Interface in eine Klasse implementieren, so dass sie ihre Funktion ausführt? Java Basics - Anfänger-Themen 7
J ArrayList add methode selbst programmieren Java Basics - Anfänger-Themen 10
X Methoden Methode zur Punktezählung in Blackjack Java Basics - Anfänger-Themen 2
W Methode ändern Java Basics - Anfänger-Themen 65
M Wie kann ich in einem Konstruktor die Methode eines anderen Interfaces mit den jeweiligen Parametern aufrufen? Java Basics - Anfänger-Themen 8
W Methode, die mit einem Datum arbeitet? Java Basics - Anfänger-Themen 22

Ähnliche Java Themen

Neue Themen


Oben