Grösste Zahl in einer Folge herausfinden. (ULAM)

Detrua

Mitglied
Guten Tag

Ich muss als Hausaufgabe Ulam folge lösen. Aufgabestellung:
*/

Es sollte ein Programm erstellt werden, die eine Zahlenfolge nach folgender Vorschrift erzeugt:
  • Der Benutzer gibt eine Startzahl ein.
  • Wenn die Zahl gerade ist, wird diese halbiert. Wenn dies nicht der Fall ist, wird diese mit 3 multipliziert und dann um 1 erhöht (Zahl*3+1).
  • Dies soll geschehen, solange die Zahl ungleich 1 ist.
  • Das Programm ermittelt die grösste Zahl aus der Folge und die Anzahl angezeigterZahlen. Diese Angaben werden am Schluss eingeblendet:
*/

Ich habe die Aufgabe lösen können, jedoch nicht ganz. Wenn ich die Zahl höher als 23 eingebe ist die Ausgabe als höchste Zahl 52 oder 160.
Jemand eine Idee wo mir den Bock passiert ist, oder vlt sogar einer geschmeidigere lösung ? Ich habe mal versucht mir Arrays zu arbeiten, ist mir aber noch zu schwer.

Hier der Code:

[CODE lang="java" title="Ulam Folge"]public class ulam_v2 {

public static void main (String[] args) {

int Zahlenfolge = 0;
int ZahlenfolgeOld = 0;
int ZahlenfolgeMax1 = 0;
int ZahlenfolgeMax2 = 0;
int ZahlenfolgeMaxResult = 0;
int Zahlenfolgewv = 0;
int i = 0;
int j = 0;



System.out.println("ULAM-Folge");
System.out.println("============================================");

System.out.print("Startzahl eingeben: ");
Zahlenfolge = Integer.parseInt(System.console().readLine());




while (Zahlenfolge != 1)
{


if ( Zahlenfolge % 2 == 0)
{

Zahlenfolge = Zahlenfolge / 2;
Zahlenfolgewv = Zahlenfolgewv + 1;

System.out.print(Zahlenfolge + "\t");


if (Zahlenfolge > i){
ZahlenfolgeMax1 = Zahlenfolge;
}
i = Zahlenfolge;


}
else
{

Zahlenfolge = (Zahlenfolge * 3) + 1;
Zahlenfolgewv = Zahlenfolgewv + 1;

System.out.print(Zahlenfolge + "\t");


if (Zahlenfolge > j){
ZahlenfolgeMax2 = Zahlenfolge;
}
j = Zahlenfolge;


}
}

if (ZahlenfolgeMax1 > ZahlenfolgeMax2){
ZahlenfolgeMaxResult = ZahlenfolgeMax1;
} else {
ZahlenfolgeMaxResult = ZahlenfolgeMax2;
}

System.out.println("\nDie Folge umfasst " + Zahlenfolgewv + " Zahlen.");
System.out.println("Die groesste Zahl ist " + ZahlenfolgeMaxResult);
}
}[/CODE]
 
Was speicherst Du denn bitte in i und j? Generell sind Deine Bezeichner sehr schwer zu verstehen. Zahlenfolge ist keine folge von Zahlen sondern nur eine Zahl. Zahlenfolgewv ist der Zähler der Anzahl - das konnte man sich aus der Ausgabe zusammen reimen ...

Aber wozu max1 und max2? Wozu brauchst Du zwei Maxima? Es kann nur ein Maxima geben.

Also reicht es bei jeder Veränderung des aktuellen Wertes zu prüfen: Ist es ein neues Maximum?

Falls man nur positive Zahlen prüft, dann würde sogar ausreichen, das bei dem *3 + 1 Zweig zu machen.

Also i/j rauswerfen und nur noch wirklich Maximum vergleichen und ggf. setzen.

Und dabei bitte die Benennung korrigieren: Variablen und Methoden fangen mit einem kleinen Buchstaben an. Klassen starten mit einem großen Buchstaben. Und dann bitte camelCase nutzen. Also wenn etwas den aktuellen Wert beinhaltet, dann wäre die Variable z.B. aktuellerWert.
 
Was speicherst Du denn bitte in i und j? Generell sind Deine Bezeichner sehr schwer zu verstehen. Zahlenfolge ist keine folge von Zahlen sondern nur eine Zahl. Zahlenfolgewv ist der Zähler der Anzahl - das konnte man sich aus der Ausgabe zusammen reimen ...

Aber wozu max1 und max2? Wozu brauchst Du zwei Maxima? Es kann nur ein Maxima geben.

Also reicht es bei jeder Veränderung des aktuellen Wertes zu prüfen: Ist es ein neues Maximum?

Falls man nur positive Zahlen prüft, dann würde sogar ausreichen, das bei dem *3 + 1 Zweig zu machen.

Also i/j rauswerfen und nur noch wirklich Maximum vergleichen und ggf. setzen.

Und dabei bitte die Benennung korrigieren: Variablen und Methoden fangen mit einem kleinen Buchstaben an. Klassen starten mit einem großen Buchstaben. Und dann bitte camelCase nutzen. Also wenn etwas den aktuellen Wert beinhaltet, dann wäre die Variable z.B. aktuellerWert.
Ja ich musste selber lachen, als ich mit meinem Kumpel nach verzweiflung angeschaut habe. Ich habe mir die aufgabe komplizierte gemacht als sie eig. ist! Hier habe ich sie mithilfe meines Kumpel und euch gelöst. danke!
[CODE lang="java" title="Ulam Folge lösung"]public class ulam_v2 {
public static void main(String[] args) {

int counter = 0;

System.out.println("Ulam-Folge");
System.out.println("============================");
System.out.print("Startzahl eingeben: ");
int number = Integer.parseInt(System.console().readLine());

int largest = number;

while (number != 1){

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

if (number > largest){
largest = number;
}

System.out.print(number + "\t");
counter = counter + 1;

}

System.out.printf("\n\nDie Folge umfasst %s Zahlen.", counter);
System.out.printf("\nDie gr\u00f6sste Zahl der Reihe ist %s.", largest);

}
}[/CODE]
 
ich sagte doch else if
klar das ich das if nach dem else meinte

Java:
} else if (number%2 == 1){

Java:
 if (number%2 == 0){
       number = number / 2;
   } else {
       number = number * 3 + 1;
 }
 

Neue Themen


Zurück
Oben