54 lines
2.4 KiB
C
54 lines
2.4 KiB
C
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <time.h>
|
|
|
|
int generiere_neue_folge(int len, int folge[]);
|
|
|
|
int main(void)
|
|
{
|
|
int folge[1001]; ///Array für bis zu 1000 Zufallszahlen (angefangen wird ab Index 1 nicht 0)
|
|
int i, laenge; ///i = Schleifenvariable; laenge speichert wie viele Zahlen in der Folge sein sollen
|
|
|
|
do
|
|
{
|
|
printf("Länge der 0/1-Folge (max. 1000): ");
|
|
scanf("%d", &laenge);
|
|
} while (laenge < 0 || laenge > 1000); ///Solange man zwischen 0 und 1000 eingibt geht es weiter
|
|
|
|
srand(time(NULL)); ///Startwert für Zufallsgenerator
|
|
|
|
for (i = 1; i <= laenge; i++) ///Start bei 1; Ende bei laenge (Zahl die man eingibt); jeder Durchlauf wird um i um 1 erhöht
|
|
folge[i] = rand() % 2; ///rand() erzeugt Zufallszahl und %2 teilt die Zahl durch 2 und gibt den Rest 0 oder 1 aus
|
|
///Zahlen werden in folge [i] gespeichert
|
|
|
|
for (i = 1; i <= laenge; i++) ///gleich wie oben
|
|
printf("%d", folge[i]); ///gibt die jede Zahl als Dezimalzahl wieder von folge [i]
|
|
printf("\n"); ///erzeugt einen Zeilenumbruch
|
|
|
|
while (laenge > 1) ///Solange mehr als eine Zahl vorhanden ist, wiederholt sich die Folge
|
|
{
|
|
laenge = generiere_neue_folge(laenge, folge); ///neue, kürzere Folge wird generiert und in laenge gespeichert
|
|
for (i = 1; i <= laenge; i++) ///nach jedem verkleinern wird die Folge wieder ausgegeben untereinander
|
|
printf("%d", folge[i]);
|
|
printf("\n");
|
|
}
|
|
return (0);
|
|
}
|
|
|
|
/*------------------------------------------ generiere_neue_folge ---------------------------------------*/
|
|
int generiere_neue_folge(int len, int folge[]) ///len: aktuelle Folge, wie viele Zahlen drin sind; folge[]: Array mit 0/1en
|
|
{
|
|
int i, j; ///i: wir starten beim ersten Element; j: der Platz an den die neue Zahl kommen soll
|
|
|
|
for (i = 1, j = 1; i < len; i += 2, j++) ///i springt immer 2 Schritte, also zu Paaren 1&2 3&4
|
|
folge[j] = !(folge[i] == folge[i + 1]); ///folge[i + 1] -> ist 1 gleich 0? -> Nein -> false = 0
|
|
///!0 heißt "nicht" also = 1
|
|
|
|
if (i == len) ///Wenn i Zahl ungerade ist, dann hat die Zahl keinen Partner -> Zahl wird einfach übernommen
|
|
folge[j] = folge[len];
|
|
else
|
|
j--;
|
|
|
|
return (j); ///Zahl wird zurückgegeben damit die main weiß wie viele Zahlen die Folge jetzt hat
|
|
}
|