Ich habe gerade vor 20 Minuten meine Prüfung in einem C-Einführungskurs beendet. Die erste Frage in der Prüfung hat mich etwas überrascht. Es ging darum, die Differenz zweier großer Zahlen zu finden.
Ziel war es, zwei Strukturen (N1 und N2) als Wert zu nehmen und die Differenz in einer als Referenz übergebenen Struktur (N3) zu speichern. Wir durften annehmen, dass N3 mit allen '0's begonnen wurde. Die MAX-Größe kann beliebig sein, so dass die Lösung auch dann noch funktioniert, wenn die Zahlen mehr als 100 Ziffern haben.
Hier ist der Basiscode (das Original kann etwas anders sein, dies ist aus dem Gedächtnis)
#include <stdio.h>
#include <stdlib.h>
/* MAX can be any length, 10, 50, 100, etc */
#define MAX 10
struct bignum
{
char digit[MAX];
char decimaldigit[MAX/2];
};
typedef struct bignum bigNum;
void difference(bigNum, bigNum, bigNum *);
/*
Original values in N1 and N2
N1.digit = { '0', '0', '0', '5', '4', '8', '2', '0', '9', '0'};
N1.decimaldigit { '0', '0', '0', '4', '9' };
N2.digit = { '0', '0', '0', '4', '8', '1', '3', '1', '4', '5'};
N2.decimaldigit { '8', '0', '1', '2', '0' };
*/
/*
Result would be:
N3.digit = { '0', '0', '0', '0', '6', '6', '8', '9', '4', '4'}
N3.decimaldigit { '1', '9', '9', '2', '9' }
*/
Das Problem besteht nicht so sehr darin, eine Lösung für dieses Problem zu finden, sondern darin, dass nur etwa 20 Zeilen für die vollständige Antwort zur Verfügung gestellt wurden. Meine Methode zur Lösung bestand darin, die Ziffern nach der Umwandlung in ganze Zahlen einzeln zu subtrahieren und dann entsprechende Überträge vorzunehmen, wenn das Ergebnis negativ war. Dies nahm wesentlich mehr Platz in Anspruch als vorgesehen war.
Angesichts der geringen Anzahl von Punkten und des für diese Frage zur Verfügung stehenden Platzes habe ich den Eindruck, dass es eine ziemlich triviale Lösung gibt, die ich nicht sehe. Wie lautet sie? Ich habe den Kurs jetzt beendet, aber diese Frage beschäftigt mich immer noch!
Eine vollständige Lösung ist nicht erforderlich, sondern nur das Innenleben der Funktion difference
.
Es dürfen keine bitweisen Operatoren verwendet werden, nur für den Fall.