Längste Collatz-Folge

sserio

Bekanntes Mitglied
Aufgabe:
Die folgende sich wiederholende Folge ist definiert für die Menge der positiven ganzen Zahlen:

n → n/2 (n ist gerade)
n → 3n + 1 (n ist ungerade)

Wenn wir die Regeln oben benutzen und mit 13 beginnen, erhalten wir die folgende Folge:

13 → 40 → 20 → 10 → 5 → 16 → 8 → 4 → 2 → 1
Es ist zu sehen, dass diese Folge (beginnend bei 13 und endend bei 1) 10 Glieder enthält. Obwohl es bisher nicht bewiesen wurde (Collatz-Problem), wird vermutet, dass alle Anfangszahlen bei 1 enden.

Welche Anfangszahl unter 1 Million erzeugt die längste Folge?
Java:
package ProjectEuler14;

import java.math.BigInteger;

public class Main {
    public static void main(String... args) {
        System.out.printf("%1$d ", findTheNumberWithTheLongestCollatzFollow(1000000));
    }

    public static int findTheNumberWithTheLongestCollatzFollow(int limit) {
        var value = 0;
        var temp = 0;
        for (var number = 3; number < limit; number++) {
            if (getFactorLength(number) > temp) {
                temp = getFactorLength(number);
                value = number;
            }
        }
        return value;
    }

    public static int getFactorLength(int number) {
        var counter = 0;
        while (number > 1) {
            if (isEven(number)) {
                number = number / 2;
                counter++;
            } else {
                number = 3 * number + 1;
                counter++;
            }
        }

        return counter;
    }

    public static boolean isEven(int number) {
        if (number % 2 == 0) {
            return true;
        } else return false;
    }
}
Weshalb gibt er mir 910107 aus ? irgendwas muss falsch laufen. Das richtige ergebnis ist 837799
 
Zuletzt bearbeitet:

sserio

Bekanntes Mitglied
Das Programm funktioniert. Ich habe es getestet mit einem anderen Rechner im Internet. Jedoch wird es irgendwie nicht aktualisiert bei 837799

EDIT: ich habe mir jetzt mal ausgeben lassen was die teiler von meinem angeblichen ergebnis und dem wirklichen ergebnis ist. Wieso zur Hölle
ist bei dem einen die richtige anzahl und bei dem anderen was komplett falsches XD
Java:
837799 //richtiges ergebnis
58 // falche teiler vom richtigen
475 //richtige Teiler vom falschen
910107 //falsches ergebnis
 
Zuletzt bearbeitet:
G

Gelöschtes Mitglied 65838

Gast
gib dir die zwischen ergebnisse aus und rechne selber die ersten paar schritte... da wo es nicht gleich ist siehst du dann den fehler

und
Java:
    public static boolean isEven(int number) {
        return number % 2 == 0;
    }
tut doch in den augen weh :D
 

sserio

Bekanntes Mitglied
gib dir die zwischen ergebnisse aus und rechne selber die ersten paar schritte... da wo es nicht gleich ist siehst du dann den fehler

und
Java:
    public static boolean isEven(int number) {
        return number % 2 == 0;
    }
tut doch in den augen weh :D
ja habs geändert. Ich glaube ich weiß woran es liegt. Ich habe gerade 20min mit dem taschenrechner durchgerechnet. Die zahl wird irgendwann zu groß .... Aber wobei ... ich habe var benutzt und ein long sollte eigentlich ausreichen
 
G

Gelöschtes Mitglied 65838

Gast
ein var ist in dem moment genau der objekt typ der rechts steht im code bzw der während compile zeit erwartet wird der raus kommt

der verändert sich nicht nach lust und laune :)

wenn du sagst

dann ist und bleibt var ein integer für immer und ewig außer du castest natürlich
 

sserio

Bekanntes Mitglied
OMFG es lag einfach daran, dass ich falsch gecastet habe!!!!! Ich habe bei *3 oder +1 jetzt überall ein großes L drangehangen und auch bei den Schleifen alles mit long gemacht. Als wenn das zu einem Fehler im ganzen programm führen kann. Oh man :(
 

sserio

Bekanntes Mitglied
ein var ist in dem moment genau der objekt typ der rechts steht im code bzw der während compile zeit erwartet wird der raus kommt

der verändert sich nicht nach lust und laune :)

wenn du sagst


dann ist und bleibt var ein integer für immer und ewig außer du castest natürlich
wo du gerade casten ansprichst xD ist es mir selber auch eingefallen
 

sserio

Bekanntes Mitglied
Java:
package ProjectEuler14;

public class Main {
    public static void main(String... args) {
        System.out.printf("%1$d ", findTheNumberWithTheLongestCollatzFollow(1_000_000));
    }

    public static long findTheNumberWithTheLongestCollatzFollow(int limit) {
        long value = 0L;
        long temp = 0L;
        for (long number = limit - 1L; number > 3L; number--) {
            if (getFactorLength(number) > temp) {
                temp = getFactorLength(number);
                value = number;

            }
        }
        return value;
    }

    public static long getFactorLength(long number) {
        var counter = 0L;
        while (number > 1L) {
            if (isEven(number)) {
                number = number / 2L;
            } else {
                number = (3L * number) + 1L;
            }
            counter++;
        }
        return counter;
    }

    public static boolean isEven(long number) {
        return number % 2L == 0L;
    }
}
 

sserio

Bekanntes Mitglied
Ob das jetzt wirklich bei jedem so nötig ist ein L dranzuhängen lass ich mal so stehen. Weil ich mich noch nicht so auskenne
 
G

Gelöschtes Mitglied 65838

Gast
naja du musst ja unterscheiden obs ein float ein long ein double usw is

double ist wahrshcienlich besser für dein ding

obs ein unsigned double auch gibt weis ich grad nicht
 

mihe7

Top Contributor
Ob das jetzt wirklich bei jedem so nötig ist ein L dranzuhängen lass ich mal so stehen. Weil ich mich noch nicht so auskenne
Nein. Java konvertiert ggf. automatisch nach long. Wenn Du z. B. ein int mit einem long vergleichst, wird der int-Wert vor dem eigentlichen Vergleich automatisch nach long konvertiert (s. https://docs.oracle.com/javase/specs/jls/se10/html/jls-5.html#jls-5.1.2 i. V. m. https://docs.oracle.com/javase/specs/jls/se10/html/jls-4.html#jls-4.2.2)

In Deiner Methode findTheNumberWithTheLongestCollatzFollow brauchst Du gar kein long und in getFactorLength nur für die Berechnung der Zahl:
Java:
    public static int getFactorLength(int initialNumber) {
        int counter = 0;
        long number = initialNumber;
        while (number > 1L) {
            if (isEven(number)) {
                number = number / 2L;
            } else {
                number = (3L * number) + 1L;
            }
            counter++;
        }
        return counter;
    }
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
O String Methode für längste Sequenz von Leerzeichen Java Basics - Anfänger-Themen 35
D Plateau auslesen und längste Ebene ausgeben Java Basics - Anfänger-Themen 5
Shalimar Längste Reihe anzeigen lassen Java Basics - Anfänger-Themen 11
M Erste Schritte Collatz Problem max int Java Basics - Anfänger-Themen 3
T Operatoren Das Collatz Problem Java Basics - Anfänger-Themen 10
P Collatz-Folge mittels indirekter Rekursion Java Basics - Anfänger-Themen 8
U Collatz mit 2 Schleifen Java Basics - Anfänger-Themen 4
I Collatz Problem Java Basics - Anfänger-Themen 3
S Abwandlung der Fibonacci Folge Java Basics - Anfänger-Themen 3
berserkerdq2 Wo geschieht der "Rücksprung, bei der rekursiven Folge Java Basics - Anfänger-Themen 5
D Grösste Zahl in einer Folge herausfinden. (ULAM) Java Basics - Anfänger-Themen 9
J Rekursive Folge (a=a-1) Java Basics - Anfänger-Themen 9
GAZ Tribonacci Folge Rekursiv Java Basics - Anfänger-Themen 11
D Hofstäter Q Folge Java Basics - Anfänger-Themen 3
V Fibonacci Folge Java Basics - Anfänger-Themen 4
M Methoden Fibonacci-Folge Java Basics - Anfänger-Themen 6
J Fibonacci -Folge rekursiv berechnen Java Basics - Anfänger-Themen 18
S Negafibonacci Folge berechnen Java Basics - Anfänger-Themen 24
T Algortihmus: Kürzeste Folge zu einer Zahl Java Basics - Anfänger-Themen 40
G Harmonische Rekursive Folge Java Basics - Anfänger-Themen 3
M Fibonacci-Folge mit while-Schleife Java Basics - Anfänger-Themen 4
J Byte Folge erkennen Java Basics - Anfänger-Themen 5
A Gerade Terme der Fibonacci-Folge aufsummieren Java Basics - Anfänger-Themen 12
R Roboter - Helmich Folge 6 Java Basics - Anfänger-Themen 32
S rekursive folge verbessern Java Basics - Anfänger-Themen 2
H JOptionPane YES Option mit Folge? Java Basics - Anfänger-Themen 2
X Problem mit Ducci-Folge Java Basics - Anfänger-Themen 7
S Fibonacci Folge Java Basics - Anfänger-Themen 34
B Element in Folge suchen Java Basics - Anfänger-Themen 7
L iterative und rekursive Folge Java Basics - Anfänger-Themen 20
N Folge verschiedener Nährwerte zur Kubikwurzel Java Basics - Anfänger-Themen 15
I Fibonacci-Folge , direkter Weg. Java Basics - Anfänger-Themen 5
J Wurzel mit einer Folge brechnen Java Basics - Anfänger-Themen 5
E Rekursive definierten Folge Java Basics - Anfänger-Themen 10
D Bit-Folge bearbeiten Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben