为什么这两个表达式产生相同的值?

时间:2017-06-30 08:27:56

标签: java string math

我尝试将字符串拆分为等长子串的数组,我要做的第一件事是计算会有多少个子串。我自己写的时候用下面的第一个表达式。当我检查别人给出的答案时,我看到了第二个,这对我来说不是很明显。实际上我无法弄清楚为什么他们会产生相同的结果,虽然我可以用具体的例子来验证。那么你如何证明它们在产生相同结果方面是等价的呢?

int groups = s.length() % subLen == 0 ? s.length() / subLen : s.length() / subLen + 1;
int groups = (s.length() + subLen - 1) / subLen;

2 个答案:

答案 0 :(得分:1)

尝试将s.length()替换为不同的值,并查看两个计算如何得出各自的结果。

从本质上讲,您的版本会考虑两种处理方式不同的情况,并且正在进行“四舍五入”。明确地在其第二个代码分支中。

第二个版本将sublen-1添加到原始字符串长度,以便整数除法的舍入/截断到达所有给定值s.length()的所需结果。

答案 1 :(得分:0)

首先让我们考虑问题的实际上下文,即将字符串(假设其长度为a)划分为一组长度相等的子字符串,假设长度为b ,然后我们知道a和b的范围应该是a >= b >= 1。如果c是整数除法a / b的结果,它总是向下舍入,而d是正常除法a / b的结果,而如果{ {1}}是一个整数d对于使a + (b - 1)更大没有影响,因为只有c可以将a + b增加1.但为什么呢必须是c而不是b - 1b - 2等?因为b - 3的最小值为1,如果在bb - ?大于1,则?可能为负值,这意味着b - ?因为c至少可以减少1,所以会减少至少1个。如果a不是整数,那么我们知道d d == c * b + r是余数r。因此(1) 1 <= r <= b - 1可以写为(a + b - 1) / b。根据(1)我们有(c * b + r + b - 1) / b,然后有b <= r + b - 1 <= 2 * (b - 1),然后有b <= r + b - 1 < 2 * b,然后是(c + 1) * b <= a + b - 1 < (c + 2) * b,这意味着c + 1 <= (a + b - 1) / b < c + 2会增加1正好除法c不是整数时。