diff --git a/a.exe b/a.exe index 19391a6..b369f66 100644 Binary files a/a.exe and b/a.exe differ diff --git a/adturing.c b/adturing.c index 3501414..271bcda 100644 --- a/adturing.c +++ b/adturing.c @@ -1,36 +1,50 @@ #include // Addiert 1 zu einer Dualzahl (als String) und speichert das Ergebnis in output +// input: Dualzahl als String, z.B. "1011" +// output: Ergebnis als String, z.B. "1100" +// maxlen: Maximale Länge des output-Arrays (inklusive '\0') void dual_addiere_eins(const char *input, char *output, int maxlen) { - int len = strlen(input); // Länge der Eingabe bestimmen - int carry = 1; // Übertrag (wir addieren 1, daher am Anfang 1) - int i, j; // Schleifenvariablen + int len = strlen(input); // Länge der Eingabe bestimmen + int carry = 1; // Übertrag: Wir addieren 1, daher am Anfang 1 + int i, pos = 0; // i: läuft durch input, pos: Position im temp-Array - char temp[maxlen]; // Temporäres Array für das Ergebnis (rückwärts) - temp[maxlen-1] = '\0'; // String-Ende setzen + char temp[maxlen]; // Temporäres Array für das Ergebnis (rückwärts) + // maxlen reicht, da Ergebnis maximal 1 Stelle länger als input sein kann // Von hinten (letztes Zeichen) nach vorne durchgehen - for (i = len - 1, j = maxlen - 2; i >= 0 && j >= 0; --i, --j) { + for (i = len - 1; i >= 0; --i) { if (input[i] == '1') { // Wenn aktuelle Ziffer 1 ist - temp[j] = carry ? '0' : '1'; // Mit Übertrag: 1+1=0 (Übertrag bleibt), sonst 1 - // carry bleibt 1, wenn carry==1 und input[i]=='1' + if (carry) { + temp[pos++] = '0'; // 1 + 1 = 0, Übertrag bleibt 1 + } else { + temp[pos++] = '1'; // 1 + 0 = 1, kein Übertrag mehr + } + // carry bleibt 1, wenn wir 1+1 gerechnet haben } else if (input[i] == '0') { // Wenn aktuelle Ziffer 0 ist - temp[j] = carry ? '1' : '0'; // Mit Übertrag: 0+1=1 (Übertrag wird 0), sonst 0 - carry = 0; // Übertrag ist jetzt weg + if (carry) { + temp[pos++] = '1'; // 0 + 1 = 1, Übertrag wird 0 + carry = 0; + } else { + temp[pos++] = '0'; // 0 + 0 = 0, kein Übertrag + } } else { - output[0] = '\0'; // Fehlerfall: ungültiges Zeichen + output[0] = '\0'; // Fehlerfall: ungültiges Zeichen in input return; } } - // Falls nach der Schleife noch ein Übertrag übrig ist (z.B. 111 + 1 = 1000) - if (carry && j >= 0) { - temp[j--] = '1'; // Setze noch eine 1 ganz vorne - } - // Rest mit Nullen auffüllen (falls nötig) - while (j >= 0) temp[j--] = '0'; - // Führende Nullen entfernen (außer die letzte Ziffer) - int start = 0; - while (temp[start] == '0' && temp[start+1] != '\0') ++start; - strcpy(output, temp + start); // Ergebnis in output kopieren + // Falls nach der Schleife noch ein Übertrag übrig ist (z.B. 111 + 1 = 1000) + if (carry) { + temp[pos++] = '1'; // Setze noch eine 1 ganz vorne + } + + temp[pos] = '\0'; // String-Ende setzen + + // Jetzt temp umdrehen und in output kopieren + // temp enthält das Ergebnis rückwärts, also müssen wir es umdrehen + for (i = 0; i < pos; ++i) { + output[i] = temp[pos - 1 - i]; + } + output[pos] = '\0'; // String-Ende setzen } \ No newline at end of file