我正在解决:
我们知道蒸发器的含量(以ml计的含量),每天损失的泡沫或气体百分比(evap_per_day)和阈值(阈值)百分比,超过该百分比蒸发器不再有用。所有数字都是严格正数。该程序报告蒸发器将停止使用的第n天(整数)。
我的递归解决方案:
if (content > (initialContent / 100) * threshold) {
double postContent = content - (content / 100) * evap_per_day;
iterations++;
return recursiveEvaporator(postContent, evap_per_day, threshold, initialContent, iterations);
}
但后来我找到了更复杂的解决方案:
return (int)Math.ceil(Math.log(threshold / 100.0) / Math.log(1.0 - evap_per_day / 100.0));
能否请您解释一下这里的对数是如何工作的以及为什么我们选择自然对数?
答案 0 :(得分:0)
首先,您必须获得e
的清晰图像,这是自然对数的基础。
e
- 是一个常数,表示我们在谈到持续增长时所要求的(1 + 1/n)^n
的近似值
我们看到新出现的"添加"参与进一步的指数化。粗略地说:e ^ x是我们在x之后的收入,其中x是t * r(t-time; r-rate)
回到你问题的主题
ln(threshold)
- 是t * r(时间*费率)
ln(1 - evap_per_day)
- 是一个t * r来逃避90%!但不是最初的,我们需要ln
,因为90%不断减少,我们应该将其考虑在内。
我们将ln(阈值)的乘积除以ln(1 - evap_per_day)以得知时间。
所以正确的解决方案是:(int)Math.ceil(Math.log(threshold / 100.0) / (ln(1.0 - evap_per_day / 100.0))
答案 1 :(得分:0)
这是使用指数衰减并求解时间的情况
指数衰减公式为A = A_o(1- r)^ t其中A是最终量,A_o是初始量,r是衰减率,t是时间。对于这个问题,我们想知道直到初始数量达到或少于初始数量的阈值百分比的天数,每天以一定百分比逃逸。我们可以这样重写方程式: (使用阈值和evapPerDay的百分比值可以简化说明) A_o(阈值)= A_o(1-evapPerDay)^ t
简化为: 阈值=(1-evapPerDay)^ t
现在我们使用日志来求解t
log(阈值)= log((1- evapPerDay)^ t)
使用日志定律之一移动t
log(阈值)= t(log(1-evapPerDay))
解决t
log(阈值)/ log(1-evapPerDay)= t
使用上限四舍五入。