聘我网

新概念招聘3.0

这个函数的依据是什么呢?

vote up0vote downstar

该函数实现将一笔钱amount按照比例ratios进行分摊,

比如100RMB按照(1,1,1)分摊的话,结果是(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;
}

问题是,里面最后一个for循环,隐含着remainder<results.length,谁能给证明一下?

 

1 个答复

vote up0vote downcheck

因为remainder是计算每个results[i]时的剩余值的总和, 而每个剩余值都小于1,故remainder=remainder_1+remainder_2+...+remainder[i]<results.length

数学公式证明如下:

alt text

顺便附上数学符号表

链接

您的回答





不是您要找的问题? 浏览其他含有标签 的问题或者 自己问个.