Info2P5/adturing.c
2025-05-08 19:00:57 +02:00

50 lines
2.1 KiB
C

#include <string.h>
// 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, 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)
// maxlen reicht, da Ergebnis maximal 1 Stelle länger als input sein kann
// Von hinten (letztes Zeichen) nach vorne durchgehen
for (i = len - 1; i >= 0; --i) {
if (input[i] == '1') { // Wenn aktuelle Ziffer 1 ist
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
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 in input
return;
}
}
// 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
}