halo
This commit is contained in:
parent
25a2dcb701
commit
fa1fd42f64
56
adturing.c
56
adturing.c
@ -1,36 +1,50 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
// Addiert 1 zu einer Dualzahl (als String) und speichert das Ergebnis in output
|
// 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) {
|
void dual_addiere_eins(const char *input, char *output, int maxlen) {
|
||||||
int len = strlen(input); // Länge der Eingabe bestimmen
|
int len = strlen(input); // Länge der Eingabe bestimmen
|
||||||
int carry = 1; // Übertrag (wir addieren 1, daher am Anfang 1)
|
int carry = 1; // Übertrag: Wir addieren 1, daher am Anfang 1
|
||||||
int i, j; // Schleifenvariablen
|
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)
|
char temp[maxlen]; // Temporäres Array für das Ergebnis (rückwärts)
|
||||||
temp[maxlen-1] = '\0'; // String-Ende setzen
|
// maxlen reicht, da Ergebnis maximal 1 Stelle länger als input sein kann
|
||||||
|
|
||||||
// Von hinten (letztes Zeichen) nach vorne durchgehen
|
// 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
|
if (input[i] == '1') { // Wenn aktuelle Ziffer 1 ist
|
||||||
temp[j] = carry ? '0' : '1'; // Mit Übertrag: 1+1=0 (Übertrag bleibt), sonst 1
|
if (carry) {
|
||||||
// carry bleibt 1, wenn carry==1 und input[i]=='1'
|
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
|
} 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
|
if (carry) {
|
||||||
carry = 0; // Übertrag ist jetzt weg
|
temp[pos++] = '1'; // 0 + 1 = 1, Übertrag wird 0
|
||||||
|
carry = 0;
|
||||||
|
} else {
|
||||||
|
temp[pos++] = '0'; // 0 + 0 = 0, kein Übertrag
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
output[0] = '\0'; // Fehlerfall: ungültiges Zeichen
|
output[0] = '\0'; // Fehlerfall: ungültiges Zeichen in input
|
||||||
return;
|
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)
|
// Falls nach der Schleife noch ein Übertrag übrig ist (z.B. 111 + 1 = 1000)
|
||||||
int start = 0;
|
if (carry) {
|
||||||
while (temp[start] == '0' && temp[start+1] != '\0') ++start;
|
temp[pos++] = '1'; // Setze noch eine 1 ganz vorne
|
||||||
strcpy(output, temp + start); // Ergebnis in output kopieren
|
}
|
||||||
|
|
||||||
|
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
|
||||||
}
|
}
|
Loading…
x
Reference in New Issue
Block a user