2016-11-12 5 views
0

Ich arbeite derzeit an einem Problem über die Collatz-Vermutung. Ich werde ein Bild des Problems anhängen.Finden der Collatz-Sequenz mit der höchsten Anzahl von Termen

Question (from ProjectEuler)

Nun ist das Problem besagt offenbar zwischen 1 und 1.000.000. Aber ich habe ein bisschen Funktionalität hinzugefügt, indem ich dem Benutzer erlaubte auszuwählen, wo der Anfangs- und Endpunkt sein sollte. Obwohl ich auf ein Problem gestoßen bin. (Als Student im ersten Jahr ohne vorherige Programmiererfahrung ist mein Wissen im Moment sehr begrenzt).

Meine Idee, wie man die mit der höchsten Sequenz oder dem höchsten 'loopCount' findet, besteht darin, die Zahl mit der entsprechenden Schleifenanzahl in ein Array zu schieben und den maximalen Schleifenzählwert in diesem Array zu finden. Aber soweit es mich betrifft, würde das ein 2d Array beinhalten.

Wie gesagt, meine Programmierkenntnisse sind begrenzt (wir haben Arrays noch nicht behandelt), also weiß ich nicht, wie ich das anfangen soll.

Hier ist, was ich bisher habe:

System.out.println("Enter starting point:"); 
    Scanner userStartingPoint = new Scanner(System.in); 
    long startingPoint = userStartingPoint.nextInt(); 

    System.out.println("Enter ending point:"); 
    Scanner userEndingPoint = new Scanner(System.in); 
    long endingPoint = userEndingPoint.nextInt(); 

    long timeBefore = System.currentTimeMillis(); 
    int loopCount; 

    for(long i = startingPoint; i <= endingPoint; i++) { 

     long number = i; 
     loopCount = 1; 

     while(number != 1) { 
      if(number%2 == 0) { 
       number = number/2; 
      } else if(number%2 != 0) { 
       number = (3*number)+1; 
      } 
      loopCount++; 
     } 

     System.out.println("Number: " + i + ". " + "Loop count: " + loopCount + "."); 
    } 

    long timeAfter = System.currentTimeMillis(); 
    long timeTaken = timeAfter - timeBefore; 
    System.out.println(endingPoint - startingPoint + " sequences."); 
    System.out.println("Time taken: " + timeTaken/1000 + " seconds."); 

I ‚long‘ als Datentyp für viele Variablen hier verwenden, weil ich, dass einige Zahlen haben Iterationen gefunden haben, die über die Höhe gehen, dass die Datentyp 'int' kann verarbeiten.

Antwort

0

Speichern Sie einfach den höchsten loopCount in einer zusätzlichen Variablen und aktualisieren Sie ihn nach jeder Iteration, falls er erhöht wurde.

int maxCount = 0; 
int loopCount; 

for(long i = startingPoint; i <= endingPoint; i++) { 

    long number = i; 
    loopCount = 1; 

    while(number != 1) { 
     if(number%2 == 0) { 
      number = number/2; 
     } else if(number%2 != 0) { 
      number = (3*number)+1; 
     } 
     loopCount++; 
    } 
    if(loopCount > maxCount){ 
     maxCount = loopCount; 
    } 
    System.out.println("Number: " + i + ". " + "Loop count: " + loopCount + "."); 
} 
System.out.println("Highest loopCount : " + maxCount); 
+0

Wie peinlich! Das ist definitiv eine viel einfachere Art, das zu tun. Vielen Dank – E13

Verwandte Themen