Martin Fowler has a Money class 돈 할당 루틴이 있습니다. 이 루틴은 반올림을 통해 값을 잃지 않고 주어진 비율 목록에 따라 돈을 할당합니다. 결과에 대한 나머지 값을 분산시킵니다.Fowler의 돈 할당 알고리즘이 정확하다는 증거
예를 들어, "ratios"(1, 1, 1)로 할당 된 $ 100은 ($ 34, $ 33, $ 33)이됩니다.
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;
}
. (이 질문을 위해, 내가 갈망으로 돈 유형을 대체하는 자유를 촬영했습니다 그것은 간단하게하기)
: 여기
는allocate
기능입니다 질문은, 그것이 옳은지 어떻게 알 수 있습니까? 최종 for-loop를 제외하고는 모두 자명 한 것처럼 보입니다. 나는 다음과 같은 관계에 사실이라고, 그것을 증명하기에 충분하다고 함수가 정확한지 증명하는 생각에 대한 루프 최종 :
이
remainder < results.length
사람이 증명할 수 있습니까?
X 번호를 Y 부분으로 나누고 싶다고합시다. 알림은 X % Y입니다. 항상