Martin Fowler has a Money class, der eine Geldzuweisungsroutine hat. Diese Routine teilt Geld gemäß einer gegebenen Liste von Verhältnissen zu, ohne irgendeinen Wert durch Runden zu verlieren. Es verteilt jeden Restwert über die Ergebnisse.Beweisen Sie, dass Fowlers Geldallokationsalgorithmus korrekt ist
Zum Beispiel würde $ 100 durch die "Ratios" (1, 1, 1) zugewiesen ergeben ($ 34, $ 33, $ 33). Hier
ist die allocate
Funktion:
public long[] allocate(long amount, long[] ratios) {
long total = 0;
for (int i = 0; i < ratios.length; i++) total += ratios[i];
long remainder = amount;
long[] results = new long[ratios.length];
for (int i = 0; i < results.length; i++) {
results[i] = amount * ratios[i]/total;
remainder -= results[i];
}
for (int i = 0; i < remainder; i++) {
results[i]++;
}
return results;
}
(. Für die Zwecke dieser Frage, es einfacher zu machen, habe ich mir die Freiheit für den Ersatz der Geldtypen mit longs genommen)
Die Frage ist, woher weiß ich, dass es richtig ist? Alles scheint ziemlich selbstverständlich zu sein, außer für die finale For-Schleife. Ich denke, dass die Funktion zu beweisen, richtig ist, wäre es ausreichend, um zu beweisen, daß die folgende Beziehung in dem endgültigen for-Schleife erfüllt ist:
remainder < results.length
Kann das jemand beweisen?
Angenommen, Sie möchten die X-Nummer in Y-Teile aufteilen. Die Erinnerung ist X% Y, was immer