Martin Fowler has a Money class che ha una routine di allocazione del denaro. Questa routine assegna denaro in base a una determinata lista di rapporti senza perdere alcun valore attraverso l'arrotondamento. Distribuisce qualsiasi valore residuo sui risultati.Prova che l'algoritmo di allocazione del denaro di Fowler è corretto
Ad esempio, $ 100 assegnati dai "ratios" (1, 1, 1) produrranno ($ 34, $ 33, $ 33).
Ecco la funzione allocate
:
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;
}
(. Per il bene di questa domanda, per rendere più semplice, mi sono preso la libertà di sostituire i tipi di denaro con anela)
Il la domanda è, come faccio a sapere che è corretto? Sembra tutto molto evidente tranne che per il ciclo finale. Credo che per dimostrare la funzione è corretta, sarebbe sufficiente a dimostrare che la seguente relazione è vera nella finale per-loop:
remainder < results.length
Qualcuno può dimostrare che?
Dire di voler dividere il numero X in parti Y. Il promemoria è X% Y che è sempre