# Permutationen



## jono (10. Nov 2022)

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 (10. Nov 2022)

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 (10. Nov 2022)

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 (10. Nov 2022)

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 (10. Nov 2022)

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:


```
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 (10. Nov 2022)

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.


----------



## jono (11. Nov 2022)

Ja, ich komme trotzdem nicht weiter auch mit den Operatoren und langem Nachdenken


----------



## fhoffmann (11. Nov 2022)

Dann mal der Code, mit dem du zu einer Zahl feststellt, wie oft welche Ziffer vorkommt:

```
int[] countNumbers(int i) {
        int[] counts = new int[10];
        while (i > 0) {
            counts[i%10] += 1;
            i /= 10;
        }
        return counts;
    }
```


----------



## KonradN (11. Nov 2022)

Oder die anderen Wege, die mir so vorschwebten:
a) Zeichen sortieren:

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

```
String.valueOf(number).chars()
    .sorted()
    .mapToObj(c -> String.valueOf((char) c))
    .collect(Collectors.joining())
```


----------



## fhoffmann (11. Nov 2022)

KonradN hat gesagt.:


> 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 (11. Nov 2022)

fhoffmann hat gesagt.:


> 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 (14. Nov 2022)

fhoffmann hat gesagt.:


> Es ist natürlich auch eine Möglichkeit:
> 
> die Zahl in einen String umzuwandeln,
> den String in ein Character-Array zu zerlegen,
> ...


Ja, genauso habe ich es jetzt auch gemacht und es funktioniert


----------

