Как рассчитать, когда уменьшенное значение достигает определенной точки? - PullRequest
0 голосов
/ 09 марта 2011

Я уверен, что раньше у меня было это в школе, но я не могу вспомнить, как называется эта вещь.

У меня есть произвольное число, и мне нужно знать, сколько раз я могу умножить его на 0,9 (или любое другое значение 0-1) до тех пор, пока от исходного числа не останется меньше x.

в формате цикла это будет выглядеть так:

num = 4654;
mult = 0.9;
limit = 140;
count = 0;
while(num >= limit){
    num *= mult;
    count++;
}

Но возможно ли это сделать без цикла? что-то с логарифмами?

Ответы [ 2 ]

6 голосов
/ 09 марта 2011

Обратите внимание, что

num * (0.9)^k <= limit

- это неравенство, которое вы хотите удовлетворить для некоторого целого числа k, и вы ищете наименьшее из таких k.Затем

(0.9)^k <= limit / num

и

k * log(0.9) <= log(limit / num)

, так что

k >= log(limit / num) / log(0.9)

, где неравенство обращается, потому что log(0.9) < 0.Таким образом, возьмите наименьшее целое число k больше log(limit / num) / log(0.9).

Итак, возьмите потолок log(limit / num) / log(0.9).

Конечно, это обобщается заменой 0.9 на r где r - ваш множитель от (0, 1).

1 голос
/ 09 марта 2011

count = log (limit / num) / log (mult)

...