Informatiker Board (http://www.informatikerboard.de/board/index.php)
- Themengebiete (http://www.informatikerboard.de/board/board.php?boardid=1)
--- Praktische Informatik (http://www.informatikerboard.de/board/board.php?boardid=6)
---- Algorithmen (http://www.informatikerboard.de/board/board.php?boardid=17)
----- C Collatzfolge (http://www.informatikerboard.de/board/thread.php?threadid=1752)


Geschrieben von Lau ra am 19.12.2013 um 14:06:

  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



Geschrieben von eulerscheZahl am 19.12.2013 um 16:56:

 

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
       }
  }


Forensoftware: Burning Board, entwickelt von WoltLab GmbH