Java Programm : Zehnstellige Zahl durch eigene Ziffern teilen?
Ich soll in Java ein Programm schreiben, welches eine 10stellige Zahl berechnet.
Dabei soll die 1. Ziffer durch 1. Die ersten beiden Ziffern durch 2. Die ersten 3. durch 3. usw teilbar sein
Die Lösung lautet 3816547290.
Nur wie kann ich dieses Programm jetzt schreiben? Gibt es so ein Programm vielleicht schon irgendwo?
5 Antworten
Ich soll in Java ein Programm schreiben
Demnach ist es also deine (Haus-)aufgabe.
Gibt es so ein Programm vielleicht schon irgendwo?
Mit Sicherheit in der Musterlösung deines Lehrers.
Nur wie kann ich dieses Programm jetzt schreiben?
Die Aufgabenstellung hast du ja. - Wie du es löst, bleibt dir offen:
- Leicht indem du eine Schleife machst bei der du hoch zählst und jede Stelle per IF-Block prüfst, ob die Kondition erfüllt ist.
- Mittel: Du verwendest 'schleife in Schleife', wobei die Äußere Schleife zum Hochzählen dient und die innere anhand der Stellen, die Bedingung Prüft.
- "Schwer": Du löst das ganze per Rekursion.
Welche Befehle benötigst du?
- Schleifen (while, for oder do)
- Bedingungen (if oder switch case)
- Modulo zur Erkennung von möglichen Restbeträgen: (%)
- Inkrement (++)
- Ganzzahlen-Datentypen: z.B. Long für deine Zahl
- Text-Datentyp: String
Die Lösung lautet 3816547290
Das sieht mir jedoch nicht nach der 'ersten' Zahl aus, auf die das Zutrifft, sondern irgendeine. (Die letzte nämlich auch nicht)
Mein Ergebnis wäre: 1020005640:
1 /1 = 1
10 /2 = 5
102 /3 = 34
1020 /4 = 255
10200 /5 = 2040
102000 /6 = 17000
1020005 /7 = 145715
10200056 /8 = 1275007
102000564 /9 = 11333396
1020005640 /10= 102000564
Gibt es so ein Programm vielleicht schon irgendwo?
Selber Denken macht schlau.
Alle Kombinationen , welche funktionieren, abspeichern.
Das heißt, du suchst alle Ergebnisse, die auf 1 Zutreffen. Das wären 10 Stück.
Das gleiche machst du für 2. Nochmal 50 Stück.
Aus den beiden könntest du schon filtern, welche nur gehen. Ist ein wenig doof, wegen erstens, aber es bleibt bei 50.
Jetzt kommen noch alle Zahlen von 0-999 dazu, die durch 3 Teilbar sind und die beiden davor auch abdecken können. Das wird schon gar nicht so viel mehr sein. Diese speichst du dir auch ab. Und so machst du immer weiter
Wenn dein Code eingesehen wird ist es Vielleicht hilfreich wenn du weder den String mittels ausprobieren noch die Ganze zahl bruteforced. sondern eine matthematische lösung findest, wenn auch der bruteforce dem computer näher läge.
http://mathepower.com/infoteilbarkeit.html
diese regeln musst du bevolgen dadurch bekommst du nen ansatz.
Ausserdem würde ich dir empfehlen die Schwierigsten stellen zu erst anzugehen.
bzw für jede stelle die einfachste regel zu verwenden
Ganz ehrlich? Ich würde die Zahl als Text zusammenbauen. Mit Textfunktionen bekommst du einfacher Zugriff auf die Ziffern als mit Rest- und Ganzzahlfunktionen. Dazu benötigst du Datentypkonvertierungsfunktionen.
Sicherlich kann man die Aufgabe auch irgendwie rekursiv lösen, aber ich würde einfach eine 10fach verschachtelte Schleife nehmen, die jede Stelle durchrotiert, bis eine Ziffernfolge gefunden wird, die allen Erfordernissen genügt.
Also grob:
for(a=1;a<=9;a++)
{Zahl = a.toString();
if(a%1==0)
{for(b=0;b<=9;b++)
{Zahl = Zahl + b.toString();
if(Links(Zahl,2).toInt % 2 == 0)
...
Einfach:
Alle Zahlen von 1000000000 bis 9999999999 in einer Schleife durchlaufen. Bei jeder der Reihe nach prüfen, ob Bedingung1, Bedingung2, ... Bedingung 10 erfüllt ist. Sobald eine Bedinung nicht erfüllt ist, abbrechen und zur nächsten Zahl gehen. Wenn alle Bedinungen erfüllt sind, Zahl ausgeben oder speichern.
Optimiert:
Überlege, wie könnte man das verbessern, so dass möglichst keine unnötigen Vergleiche mehr gemacht werden müssen. Zum Beispiel müsste man die erste Ziffer gar nicht prüfen, da diese immer durch 1 teilbar ist.
Schön nicht, aber Bruteforce :-) Vielleicht programmier ich das mal schnell, nimmt mich wunder wie viele Treffer es gibt.
Schöner Bruteforce