From c55efdda3c02d608addcf1e39c268261a49effd0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn?= Date: Tue, 2 Dec 2025 09:08:42 +0100 Subject: [PATCH] =?UTF-8?q?Grundkonzept=20f=C3=BCr=20das=20Numbers=20Array?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- numbers.c | 74 ++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 73 insertions(+), 1 deletion(-) diff --git a/numbers.c b/numbers.c index f59d9a2..058e318 100644 --- a/numbers.c +++ b/numbers.c @@ -2,8 +2,8 @@ #include #include #include +#include #include "numbers.h" -#include "bintree.h" //TODO: getDuplicate und createNumbers implementieren /* * * Erzeugen eines Arrays mit der vom Nutzer eingegebenen Anzahl an Zufallszahlen. @@ -16,11 +16,83 @@ // creating random numbers. unsigned int *createNumbers(unsigned int len) { + if (len < 2) { + // Mindestens zwei Elemente nötig, damit ein Duplikat existiert + return NULL; + } + unsigned int *numbers = malloc(len * sizeof(unsigned int)); + if (!numbers) return NULL; + + bool *used = calloc(2 * len + 1, sizeof(bool)); + if (!used) { + free(numbers); + return NULL; + } + + static int initialized = 0; + if (!initialized) { + srand((unsigned int)time(NULL)); + initialized = 1; + } + + // Einzigartige Zufallszahlen generieren + for (unsigned int i = 0; i < len - 1; ) { + unsigned int num = (rand() % (2 * len)) + 1; + if (!used[num]) { + used[num] = true; + numbers[i++] = num; + } + } + + // Eine der Zahlen duplizieren + unsigned int duplicateIndex = rand() % (len - 1); + numbers[len - 1] = numbers[duplicateIndex]; + + // Fisher–Yates shuffle + for (unsigned int i = len - 1; i > 0; i--) { + unsigned int j = rand() % (i + 1); + unsigned int tmp = numbers[i]; + numbers[i] = numbers[j]; + numbers[j] = tmp; + } + + free(used); + return numbers; } // Returns only the only number in numbers which is present twice. Returns zero on errors. unsigned int getDuplicate(const unsigned int numbers[], unsigned int len) { + if (numbers == NULL || len < 2) { + return 0; + } + unsigned int *sortedNumbers = malloc(len * sizeof(unsigned int)); + if (sortedNumbers == NULL) { + return 0; + } + memcpy(sortedNumbers, numbers, len * sizeof(unsigned int)); + + // Einfacher bubble sort + for (unsigned int i = 0; i < len - 1; i++) { + for (unsigned int j = 0; j < len - i - 1; j++) { + if (sortedNumbers[j] > sortedNumbers[j + 1]) { + unsigned int temp = sortedNumbers[j]; + sortedNumbers[j] = sortedNumbers[j + 1]; + sortedNumbers[j + 1] = temp; + } + } + } + + unsigned int duplicate = 0; + for (unsigned int i = 0; i < len - 1; i++) { + if (sortedNumbers[i] == sortedNumbers[i + 1]) { + duplicate = sortedNumbers[i]; + break; + } + } + + free(sortedNumbers); + return duplicate; } \ No newline at end of file