Markoff-Zahl

Diskutiere Markoff-Zahl im Java Basics - Anfänger-Themen Forum; Guten Tag zusammen, ich hab ein Problem und komme einfach auf keine Lösung :( Eigentlich ist die Aufgabe die ich hier versuche überhaupt nicht...

  1. ocsme
    ocsme Mitglied
    Guten Tag zusammen,

    ich hab ein Problem und komme einfach auf keine Lösung :( Eigentlich ist die Aufgabe die ich hier versuche überhaupt nicht schwer doch Ich bekomme es nicht hin :(

    Also ich versuche die Markoff-Zahlen zu programmieren. Das ganze versuche ich so das ich ein Array erstelle dort die Quersummen der Zahlen speichern möchte und dann drüber laufen will ob die Quersumme in dem Array schon vorhanden ist doch ich bekomme ja nicht mal die Zahlen vernünftig ins Array rein :(

    Hier mal mein Versuch:

    Code (Text):
    int n=10;
            int[] quersumme=new int[n*n];
            int counter=0;
            int tmp=0;
           
            for(int i=1;i<=n;i++) {
                for(int j=1;j<=n;j++) {
                    for(int k=1;k<=n;k++) {
                    if(i*i+j*j+k*k==3*i*j*k) {
                        tmp=i+j+k;
                        System.out.println(i+" "+j+" "+k+" "+tmp);

                    }

                        }
                    }
                }
    Die Ausgabe ist:
    1 1 1 3
    1 1 2 4
    1 2 1 4
    1 2 5 8
    1 5 2 8
    2 1 1 4
    2 1 5 8
    2 5 1 8
    5 1 2 8
    5 2 1 8

    Ich will jetzt alle Zahlen die ein doppelten tmp haben raus werfen. Doch immer wenn ich versuche eine neue Quersumme in mein Array zu speichern überschreibt er mir das ganze Array mit der gefunden quersumme. Ich hab keine Ahnung wie ich in so einer Schleifen-Kaskade vernünftig nochmal durch mein quersummen Array laufen kann.
    Bin über jede Hilfreiche Antwort sehr dankbar :)

    LG
     
  2. Vielleicht hilft dir dieses Buch hier weiter.
  3. Flown
    Flown Administrator Mitarbeiter
    Ich seh in deinem Code nicht, wie du dir das Array überschreibst...
     
  4. ocsme
    ocsme Mitglied
    Flown stimmt :D ich hab meinen ersten Versuch Kopiert grrr...
    Hier mal der bis jetzt neue Versuch. Nun ist es gar nicht mehr ganz so schlimm :D Das Array wird mit Quersummen gefüllt doch noch immer so wie ich es gerne hätte. Denn es werden weiterhin Dupletten Kopiert :(

    Code (Java):
    int n=100;
        int quersumme=0;
        int tmp=0;
        int[] qArray=new int[n*n];
        int counter=0;
       
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
                for(int k=1;k<=n;k++) {
                    if(i*i+k*k+j*j==3*i*k*j) {
                        tmp=quersumme;
                        quersumme=i+j+k;
                        if(tmp!=quersumme) {
                            qArray[counter]=quersumme;
                            System.out.println("("+i+","+k+","+j+")");
                            counter++;
                        }
                       
                    }
                }
       
        for(int i=0;i<=counter;i++)
            System.out.println(qArray[i]);
           
     
  5. mihe7
    mihe7 Bekanntes Mitglied
    Du prüfst ja immer nur ab, ob die neue Quersumme sich von der letzten Quersumme unterscheidet.
     
  6. ocsme
    ocsme Mitglied
    ja weil ich es nicht anders hin bekomme :(
    ich sitze hier schon seit stunden an sowas :( das ist sicherlich so schwer nicht doch ich bekomme es gerade überhaupt nicht hin. Ich denke ich werde es erstmal sein lassen sonst macht man sich nur Verrückt :D
     
  7. mihe7
    mihe7 Bekanntes Mitglied
    Na, komm... Implementiere:
    Code (Java):

    boolean contains(int[] arr, int len, int value) {
        // return true genau dann wenn es einen index i mit 0 <= i < len gibt, so dass
        // arr[i] == value gilt
    }
     
     
  8. Blender3D
    Blender3D Aktives Mitglied
    Also es geht darum die Markhoffzahlen zu ermitteln?
    Eine Markoff-Zahl ist eine natürliche Zahl x , y oder z, die als Lösung der diophantischen Markoff-Gleichung
    x^2 + y^2 + z^2 = 3*x*y*z vorkommt.
    Die ersten Markoff-Zahlen sind 1, 2, 5, 13, 29, 34, 89, 169, 194, 233, 433, 610, 985, 1325, …

    Man kann aus einer Lösung (x ,y ,z ) der Markoff-Gleichung mittels (x ,y ,z) → (x ,y ,3*x*y − z) weitere Lösungen erzeugen.

    Ich würde ein Klasse für die Trippel bauen mit obigen Bedingungen.
    z.B.
    Code (Java):
    import java.util.Arrays;

    public class MarkhoffTripple {
        private int[] values = new int[3];

        public MarkhoffTripple(int x, int y, int z) throws IllegalArgumentException {
            values[0] = x;
            values[1] = y;
            values[2] = z;
            setValues(values);
        }

        public MarkhoffTripple(int[] values) throws IllegalArgumentException {
            setValues(values);
        }

        @Override
        public boolean equals(Object obj) {
            if (this == obj)
                return true;
            if (obj == null)
                return false;
            if (getClass() != obj.getClass())
                return false;
            MarkhoffTripple other = (MarkhoffTripple) obj;
            if (!Arrays.equals(values, other.values))
                return false;
            return true;
        }

        public int getCrossSum() {
            return values[0] + values[1] + values[2];
        }

        public int[] getValues() {
            return Arrays.copyOf(values, values.length);
        }

        public MarkhoffTripple[] getFollower() {
            MarkhoffTripple[] neigbours = new MarkhoffTripple[2];
            if (getCrossSum() == 3) {
                neigbours = new MarkhoffTripple[1];
                neigbours[0] = new MarkhoffTripple(1, 1, 2);
                return neigbours;
            }
            if (getCrossSum() == 4) {
                neigbours = new MarkhoffTripple[1];
                neigbours[0] = new MarkhoffTripple(1, 2, 5);
                return neigbours;
            }
            int x = values[1];
            int y = values[2];
            int z = values[0];
            neigbours[1] = new MarkhoffTripple(x, y, 3 * x * y - z);
            x = values[0];
            y = values[2];
            z = values[1];
            neigbours[0] = new MarkhoffTripple(x, y, 3 * x * y - z);
            return neigbours;

        }

        public static boolean isMarkhoffTripple(int x, int y, int z) {
            return x * x + y * y + z * z == 3 * x * y * z;
        }

        private void setValues(int[] values) {
            if (values == null || values.length != 3 || !isMarkhoffTripple(values[0], values[1], values[2]))
                throw new IllegalArgumentException("No Markhofftripple!");
            this.values = Arrays.copyOf(values, values.length);
            Arrays.sort(this.values);
        }

        @Override
        public String toString() {
            return "[" + values[0] + "," + values[1] + "," + values[2] + "]";
        }
    }
    Code (Java):
        public static void main(String[] args) {
            Vector<MarkhoffTripple> tripples = new Vector<MarkhoffTripple>();
            tripples.add(new MarkhoffTripple(1, 1, 1));
            getMarkahoff(tripples, 0, 10);
            for (MarkhoffTripple i : tripples)
                System.out.print(i + " ");
        }

        private static void getMarkahoff(Vector<MarkhoffTripple> tripples, int pos, int n) {
            if (pos == n)
                return;
            MarkhoffTripple t = tripples.get(pos);
            MarkhoffTripple[] follows = t.getFollower();
            for (int i = 0; i < follows.length; i++) {
                if (tripples.size() < n)
                    tripples.add(follows[i]);
            }
            pos++;
            getMarkahoff(tripples, pos, n);
        }
    Aus den Trippel lassen sich dann die Markhoff Zahlen einfach abbilden.
     
    mihe7 gefällt das.
  9. ocsme
    ocsme Mitglied
    Danke für eure Antworten.
    Von Blender verstehe ich fast nix obwohl wir das fast alles hatten ein paar sachen sind neu doch normalerweise sollte ich das mitlerweile besser verstehen können! Denke ich lasse es einfach.

    Danke nochmals =)

    LG
     
  10. mihe7
    mihe7 Bekanntes Mitglied
    Wie?!? Aufgeben? Implementiere doch einfach mal die Methode, die ich oben skizziert habe.
     
  11. ocsme
    ocsme Mitglied
    Ja irgendwie hab ich das gefühl egal wieviel ich lerne und Üben tue es klappt einfach nicht! :(

    so hab ich es jetzt gemacht:
    Code (Java):

    public class MarkoffMain {

        static boolean contains(int[] arr, int len, int value) {
            for(int i=0;i<len;i++)
                if(arr[i]==value)
                    return true;
            return false;
        }
       
        public static void main(String[] args) {
       
            int n=10;
            int[] a=new int[n*n];
            int pos=0;
            int quersumme=0;
           
            for(int x=1;x<=n;x++)
                for(int y=1;y<=n;y++)
                    for(int z=1;z<=n;z++) {
                        if(x*x+y*y+z*z==3*x*y*z) {
                            quersumme=x+y+z;
                           
                               
                            }
                        }
           
            }  
        }

    Wie ich jetzt mit der Methode umzugehen habe weis ich auch nicht so recht :(
     
  12. Wenn du Java lernen möchtest, empfehlen wir dir dieses Buch hier
Passende Stellenanzeigen aus deiner Region:





Thema: Markoff-Zahl