C Collatzfolge

Neue Frage »

Auf diesen Beitrag antworten »
Lau ra C Collatzfolge

Meine Frage:
Hallo. Ich bin absolute "Programmiernooberin" und muss jetzt an der Uni C machen. Ich verstehe einzelne Befehle nicht bzw. das Verständnis ist einfach nicht da wieso das Programm so funktioniert und wie man es auch anders machen könnte. Also die Aufgabenstellung ist:

a) Die Collatz-Folge ist folgendermaßen definiert:

Man wähle eine beliebige natürliche Zahl a(0) und bilde damit die
Zahlenfolge

a(n + 1) = a(n)/2, falls a(n) gerade
a(n + 1) = 3a(n) + 1, falls a(n) ungerade

Die Folge endet, wenn a(n+1) den Wert 1 erreicht. Den Wert n+1 nennt
man dann die Länge der Collatz-Folge zum Startwert a(1).

Schreiben Sie ein Programm in C, welches die Collatzfolge (n und a(n))
für a(0) = 871 ausgibt.

b) Implementieren Sie eine Routine collatz_length(n), die für das übergebene
n die Länge der Collatz-Folge berechnet. Schreiben Sie ein Programm,
welches collatz_length() benutzt, um danach zu suchen, für welchen
Startwert im Bereich 1 ... 1000000 die Länge der Collatz-Folge maximal
wird.

Meine Ideen:
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
/* Collatz-Folge */

#include <stdio.h>
#define MAXPRIME 871
int main (void) {
 
int n ;
printf ("Zahl eingeben:  ");

n=871;
while (n!=1) {
       if (n%2==0) {
       n=n/2.0;
       printf ("%d\n", n);
        }
       else {
       n=3*n+1;
       printf ("%d\n", n);
       }
  }
return 0;
}

Das wäre soweit zur a) Könnte mir vielleicht jemand wieso return 0 am Ende macht und am Anfang diese ganzen Befehle sind mir auch nicht klar.

Bedanke mich schon mal für die Aufmerksamkeit und Hilfe.

Liebe Grüße Laura
 
Auf diesen Beitrag antworten »
eulerscheZahl

Die Aufgabe kenne ich doch smile

zum Programm:
- printf ("Zahl eingeben: "); macht keinen Sinn, wenn du danach keine Zahl einlesen möchtest.
- Du schreibst #define MAXPRIME 871, ohne das danach zu verwenden.
- Du zählst nicht, wie viele Schritte es dauert, bis die Folge bei 1 ankommt
- n=n/2.0; n /= 2 (2 als int, nicht double) tut es auch.
- printf ("%d\n", n); steht bei if und bei else, das könnte man auch aus dem if-else Konstrukt herausnehmen und danach setzen

return 0; ist die Rückgabe der main-Funktion. Das heißt etwa: das Programm ist abgelaufen, es ist kein Fehler aufgetreten.
Was meinst du mit Befehlen am Anfang?
#include <stdio.h> sorgt dafür, dass du Funktionen wie printf verwenden kannst.

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
n=871;
while (n!=1) { //solange n nicht 1 ist:
       if (n%2==0) { //wenn n ohne Rest durch 2 teilbar ist
       n=n/2.0; //dann halbiere n
       printf ("%d\n", n); //und gib n aus
        }
       else { //sonst - also n ist nicht ohne Rest durch 1 teilbar
       n=3*n+1; // erhöhe n
       printf ("%d\n", n); //und gib n aus
       }
  }
 
Neue Frage »
Antworten »


Verwandte Themen