Erste Schritte Permutationsrechner

kzoltner

Neues Mitglied
Hallo.
Vorweg eins: Ich bin relativ unerfahren, was Java angeht.

Aber nun zur Aufgabe:
Es geht um eine kleine mathematische Spielerei. Hierbei soll eine Zahl gefunden, welche mit verschiedenen Faktoren multipliziert eine Permutation der Zahlen gibt.
Also zum Beispiel:

Zahl: 142857 ( 285714;428571;571428 )

Hier wurde mit den Faktoren 1,2,3,4 gerechnet.

Nun habe ich ein Programm, dass mir neben diesem einen richtigen Ergebnis im Bereich 100.000 bis 150.000 leider etliche falsche Zahlen auflistet.

Hier das Programm:

Java:
package kleinstePerm;

import java.util.*;

public class KleinstePermutation {
	public static void main(String[] args)
	{
		int faktoren = 4; // Faktoren. Beispiel: 4 = 1,2,3,4 ; 6 = 1,2,3,4,5,6 ... 
		long zeitVorher=System.currentTimeMillis(); // Zeitmessung
		int zahl = 100000;
		
		while(zahl < 150000)
		{
			boolean isPermutation = true;
			for(int i=1; i<=faktoren; i++)
			{
				if(!checkPermutation(zahl, zahl*i))
				{
					isPermutation = false;
					break;
				}
			}
			if(isPermutation) 
			{
				System.out.println("Zahl: " + zahl + " ( "+zahl*2+";"+zahl*3+";"+zahl*4+" ) - Zeit: " + (System.currentTimeMillis() - zeitVorher) + "ms");
			}
			zahl++;

		}
	
	}
	
	public static boolean checkPermutation(int x1, int x2)
	{
		boolean flag = true;
		
		List<Integer> zahlen1 = new ArrayList<Integer>();
		List<Integer> zahlen2 = new ArrayList<Integer>();
		
		while (x1>0) {
		    zahlen1.add(0, new Integer(x1%10));
		    x1=x1/10;
		}
		
		while (x2>0) {
		    zahlen2.add(0, new Integer(x2%10));
		    x2=x2/10;
		}
		
		if(zahlen1.size() != zahlen2.size()) { return false; }

        for (int i=0; i<zahlen1.size(); i++)
        {
        	boolean found = false;
        	Integer temp = zahlen1.get(i);
    
        		if(zahlen2.contains(temp))
        		{
        			found = true;
        			zahlen2.remove(temp);
        			zahlen1.remove(temp);
        			
        		}
        	
        	if(!found)
        	{
        		flag = false;
        		break;
        	}
        }
        	   
		return flag;
	}
	
}

Und hier die Ausgabe, die mir eclipse liefert:

Zahl: 100305 ( 200610;300915;401220 ) - Zeit: 7ms
Zahl: 100503 ( 201006;301509;402012 ) - Zeit: 12ms
Zahl: 100547 ( 201094;301641;402188 ) - Zeit: 13ms
Zahl: 100728 ( 201456;302184;402912 ) - Zeit: 16ms
Zahl: 100729 ( 201458;302187;402916 ) - Zeit: 16ms
Zahl: 102507 ( 205014;307521;410028 ) - Zeit: 24ms
Zahl: 102607 ( 205214;307821;410428 ) - Zeit: 24ms
Zahl: 102707 ( 205414;308121;410828 ) - Zeit: 25ms
Zahl: 102708 ( 205416;308124;410832 ) - Zeit: 25ms
Zahl: 106534 ( 213068;319602;426136 ) - Zeit: 29ms
Zahl: 109728 ( 219456;329184;438912 ) - Zeit: 32ms
Zahl: 129857 ( 259714;389571;519428 ) - Zeit: 50ms
Zahl: 142857 ( 285714;428571;571428 ) - Zeit: 61ms

Joa, ich hab ne Vermutung, dass das Entfernen der Elemente nicht richtig funktioniert.
Vielleicht erbarmt sich ja ein findiger Programmierer meiner Dummheit :)

Gruß
 

Klösp

Aktives Mitglied
Ich habs mir von der Logik nicht komplett angeschaut, aber ich denke der Fehler liegt in der For-Schleife.

Für den Fall die Ziffer ist in beiden Listen vorhanden.
Wenn du aus Zahlen1 i entfernst, entfernst du immer das erste Element.
Dann müsstes du im nächsten Durchlauf auch das neue erste Element aus Zahlen1 nehmen.
Du zählst aber i immer hoch. Dabei wirst du, so wie ich das sehe, einige Element überspringen.
 
Zuletzt bearbeitet:

Oben