मार्टिन फाउलर has a Money class जिसमें धन आवंटन दिनचर्या है। यह दिनचर्या राउंडिंग के माध्यम से किसी भी मूल्य को खोए बिना अनुपात की एक दी गई सूची के अनुसार धन आवंटित करता है। यह परिणामों पर किसी भी शेष मूल्य फैलता है।सबूत है कि फाउलर का पैसा आवंटन एल्गोरिदम सही है
उदाहरण के लिए, "अनुपात" (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
समारोह है सवाल यह है कि, मुझे कैसे पता चलेगा कि यह सही है? फाइनल फॉर-लूप को छोड़कर यह सब बहुत स्पष्ट है। मुझे लगता है कि साबित करने के लिए समारोह सही है, यह साबित करने के लिए पर्याप्त होगा कि निम्नलिखित के संबंध में सच है फाइनल के लिए लूप:
remainder < results.length
किसी को भी यह साबित कर सकते हैं?
कहें कि आप एक्स संख्या को वाई भागों में विभाजित करना चाहते हैं। अनुस्मारक एक्स% वाई है जो हमेशा होता है <वाई। मैं इसे काफी स्पष्ट कहूंगा। 3% 2 = 1, 4% 2 = 0 ... –