Info2/25.3.2.c
2025-04-23 16:20:48 +02:00

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
}