Permutationen

jono

Top Contributor
Hallo,

ich habe eine kleine Aufgabe:

Die Zahl 125874 und das Doppelte der Zahl, 251748, enthalten genau die gleichen Ziffern, die nur anders angeordnet sind. Eine solche Zahl nennt man eine zyklische Zahl. Implementieren Sie die Methode cyclicNumber der Klasse CyclicNumber, die den kleinsten Integer x berechnet, für den gilt das x*2, x*3, x*4, x*5 und x*6 die gleichen Ziffern enthalten.
Die Aufgabe verstehe ich, ich wollte nur um Rat bitten, wie ich diese am besten angehen kann, stehe gerade etwas auf dem Schlauch
 

KonradN

Super-Moderator
Mitarbeiter
Sowas geht man immer ganz gradlinig an. Was sind denn da die notwendigen Schritte? Du willst den kleinsten integer Wert haben, für den eine Bedingung gilt. Also ganz trivial:
  • Zahl := 1
  • So lange Bedingung nicht erfüllt:
--> Zahl := Zahl + 1
- Ausgabe Zahl

Dann musst Du beschreiben, wie Du die Bedingung prüfst. Dazu diese erst einmal genau formulieren. Das kannst Du Dir überlegen. Und da kannst Du Dir eine gradlinige Lösung überlegen.
 

fhoffmann

Top Contributor
Ergänzend zu dem, was @KonradN schon gesagt hat, noch ein Vorschlag:

Du kanst dir die vorkommenden Ziffern in einem int-Array der Größe 10 merken.
An der Stelle i steht dann die Häufigkeit, mit der die Ziffer i in der Zahl vorkommt.
Bei der Zahl 12321 bekämst du folgendes Array [0, 2, 2, 1, 0, 0, 0, 0, 0, 0].
Diese Arrays kannst du dann mit java.util.Arrays.equals(arr1, arr2) vergleichen.
 

KonradN

Super-Moderator
Mitarbeiter
Da jetzt schon etwas mehr an Möglichkeiten verraten wurde: Es gibt da viele Ansätze - der Ansatz, der mir durch den Kopf ging, war, dass ich die Ziffern sortieren würde um dann die Ziffern zu vergleichen. Das wäre halt so ein typisches Schema F, das man auch sehr schön und kurz über Streams ausdrücken könnte.
 

jono

Top Contributor
Was mir nicht in den Sinn kommt ist: Wie schreibe ich jetzt in Code die Häufigkeit der Zahlen von 0 bis 9 an die jeweilige Stelle des jeweiligen Arrays? Ich habe dazu erstmal folgenden Code:

Java:
public class CyclicNumber {



    public static void main(String[] args) {

        System.out.println();

    }



    public static int cyclicNumber(int x) {



        int[] array = new int[9];

        x = 1;



        while (x >= 1) {



            int xy = x * 2;



            int xy1 = x * 3;



            int xy2 = x * 4;



            int xy3 = x * 5;



            int xy4 = x * 6;



        }



    }



}

Ich möchte erstmal alle Zahlen erzeugen mit xy... . Innerhalb der while-Schleife möchte ich noch eine if-Bedingung einbauen, dass wenn die arrays, welche die Häufigkeiten der erzeugten xy-Zahlen enthalten, mit dem array, welches die Häufigkeiten der x-Zahlen enthält "Gleichheit" aufweisen, x zurückgegeben werden soll.
Ich habe jetzt aber das Problem, dass ich nicht weiß, wie ich die Häufigkeit der Zahlen eines Integers zähle und dann muss ich ja auch noch jedem array index einzeln die häufigkeiten zuweisen. Denke da gerade ziemlich kompliziert glaube ich...
 

KonradN

Super-Moderator
Mitarbeiter
Wenn Du mit Zahlen hantieren willst: Schau Dir mal die Operatoren / und % an.
Wenn Du mit Strings arbeiten willst, dann wäre die Klasse String bestimmt interessant.

Gewissen Umgang mit Zahlen und auch mit Strings solltest Du bereits gehabt haben.

Un spiele es doch einfach mal mit Stift und Papier durch, was Dir durch den Kopf geht. Dir sowas vor zu geben wird Dir aus meiner Sicht nicht helfen. Dann ist eine Übung mehr vorbei ohne dass Du die Grundlagen gelernt hast.
 

fhoffmann

Top Contributor
Dann mal der Code, mit dem du zu einer Zahl feststellt, wie oft welche Ziffer vorkommt:
Java:
    int[] countNumbers(int i) {
        int[] counts = new int[10];
        while (i > 0) {
            counts[i%10] += 1;
            i /= 10;
        }
        return counts;
    }
 
Zuletzt bearbeitet:

KonradN

Super-Moderator
Mitarbeiter
Oder die anderen Wege, die mir so vorschwebten:
a) Zeichen sortieren:
Java:
char[] chars = String.valueOf(number).toCharArray();
Arrays.sort(chars);

Damit hat man dann Arrays, die man direkt vergleichen kann. (z.B. per Arrays.equals)

b) Man kann statt einem Array von Zahlen natürlich auch einfach einen String erzeugen. Das geht dann z.B. einfach per Stream und könnte dann so aussehen:

Erst einmal die einzelnen Bauteile:
int -> String: String.valueOf(zahl);
Stream der Zeichen: string.chars().
Sortieren: intStream.sorted();
Jede Ziffer zu einem String machen: intStream.mapToObj( x -> String.valueOf( (char) x)
Daraus einen String machen: stream.collect(Collectors.joining());

Damit wäre der Ausdruck dann:
Java:
String.valueOf(number).chars()
    .sorted()
    .mapToObj(c -> String.valueOf((char) c))
    .collect(Collectors.joining())
 

fhoffmann

Top Contributor
Oder die anderen Wege, die mir so vorschwebten:
Es ist natürlich auch eine Möglichkeit:
  • die Zahl in einen String umzuwandeln,
  • den String in ein Character-Array zu zerlegen,
  • das Character-Array zu sortieren
  • und dann die sortierten Caharacter-Arrays zu vergleichen.
Aber ich finde diese Möglichkeit nicht "naheliegend", wenn ich die Ziffern von Zahlen vergleichen will.
 

KonradN

Super-Moderator
Mitarbeiter
Aber ich finde diese Möglichkeit nicht "naheliegend", wenn ich die Ziffern von Zahlen vergleichen will.
Mein Hintergedanke war dabei, dass man, wenn sowas ja mit Stift und Papier durchspielt, man ggf, mehr mit den Zeichen der Zahl arbeitet. Deine Idee, ein Array mit 10 Stellen zu nutzen um die Anzahl der Ziffern zu zählen, war mir z.B. nicht auf Anhieb gekommen. Ich hätte die einzelnen Ziffern sortiert.

Und da ist die Aufteilung über String mit am einfachsten. Bei der Zahl müsste man das Array erzeugen (Größe wäre dann wohl Math.ceil(Math.log10(zahl+1)) oder? Alleine schon dieser Punkt ist nicht intuitiv, oder?) und dann mit den Ziffern befüllen.

Das ist aber bitte nicht als eine Ablehnung Deiner Lösung zu sehen. Deine Lösung ist die deutlich saubere der ich auch den Vorzug geben würde. Das ist nur eine Erklärung, wie ich zu der Lösung gekommen bin / wieso ich diese als erwähnenswert empfand.
 

jono

Top Contributor
Es ist natürlich auch eine Möglichkeit:
  • die Zahl in einen String umzuwandeln,
  • den String in ein Character-Array zu zerlegen,
  • das Character-Array zu sortieren
  • und dann die sortierten Caharacter-Arrays zu vergleichen.
Aber ich finde diese Möglichkeit nicht "naheliegend", wenn ich die Ziffern von Zahlen vergleichen will.
Ja, genauso habe ich es jetzt auch gemacht und es funktioniert
 

Neue Themen


Oben