| 
| 
 | Вопрос # 3 316/ вопрос открыт / | 
 |  Здравствуйте, эксперты!Одна баночка кока-колы стоит B рублей. Пустую баночку из-под кока-колы можно сдать и получить за неё E рублей.
 У Васи есть R рублей. Он покупает кока-колу, выпивает её, сдаёт баночку, снова покупает кока-колу и так далее до тех пор,
 пока имеющихся у него денег (после сдачи очередной баночки) хватает на покупку кока-колы. Сколько банок кока-колы
 он выпьет?
 
 Примеры ввода: 2 1 3    Вывод: 2
 3 1 13    Вывод: 6
 2 1 1      Вывод: 0
 
|  |   Вопрос задал: Arti (статус: Посетитель)Вопрос отправлен: 22 октября 2009, 15:10
 Состояние вопроса: открыт, ответов: 2.
 |  Ответ #1. Отвечает эксперт: Вадим К Здравствуйте, Arti!пусть есть денег R. тогда он может купить
 m := R div B банок. у него останеться n := R mod B рублей.
 когда он сдаст эти банки, у него будет денег
 R := m * E + n;
 если R больше B (то есть у него ещё есть деньги), то повторяем всю цепочку заново.
 
 Осталось только добавить счетчик банок и решение готово.
 
|  | Ответ отправил: Вадим К (статус: Академик)Время отправки: 22 октября 2009, 15:18
 
 |  Ответ #2. Отвечает эксперт: min@y™ Вот тибе функция расчёта
 
 function GetCanCount(B, E, R: Cardinal): Cardinal;
begin
  Result:= 0;
 
  if B <= E
    then Exit; // некоррекнтые данные
 
  while (R >= B) do
    begin
      Inc(Result);
      R:= R - B + E;
    end;
end;Программа под катом.
 Приложение:Переключить в обычный режим program p3316; {$APPTYPE CONSOLE} uses  SysUtils; function GetCanCount(B, E, R: Cardinal): Cardinal;begin  Result:= 0;   if B <= E    while (R >= B) do    begin      Inc(Result);      R:= R - B + E;    end;end; var  B, E, R: Cardinal; begin  Write(' Enter the B, E and R values: ');  ReadLn(B, E, R);   WriteLn(' Can count: ', GetCanCount(B, E, R));   ReadLn;end.
|  | Ответ отправил: min@y™ (статус: Доктор наук)Время отправки: 22 октября 2009, 15:44
 
 |  
 Мини-форум вопросаВсего сообщений: 4; последнее сообщение — 22 октября 2009, 15:57; участников в обсуждении: 2. 
|   | Arti (статус: Посетитель), 22 октября 2009, 15:19 [#1]:Спасибо, уже решил. Достаточно в цикле вычесть из суммарных его денег стоимость одной баночки (рыночную), прибавить цену баночки, как он её продал, и увеличивать счётчик банок на +1.
 В цикле условие сумма денег >= рын. цена одной банки.
 Спасибо!
 |  
|   | Вадим К (статус: Академик), 22 октября 2009, 15:37 [#2]:решение хорошее, но далеко не оптимальное. Если денег припустим миллион, то долго будет вычитать. А на олимпиадных задачах обычно ставиться лимит по времени. 
 p.s. здесь "спасибо" балами ставят
   Галочка "подтверждения прочтения" - вселенское зло. |  
|   | Arti (статус: Посетитель), 22 октября 2009, 15:44 [#3]:Ок, без проблем. Как смогу - поставлю. 
 Ваше решение попробовал, но оно выдаёт некорректные выходные данные.
 
 Как при целом R, так и при дробном.
 |  
|   | Вадим К (статус: Академик), 22 октября 2009, 15:57 [#4]:ну наверно стоит выводить в копейках сумму и всё будет хорошо. Ведь дробных  копеек в обычных расчетах быть не может. Хотя может просто неаккуратно реализовали алгоритм. Галочка "подтверждения прочтения" - вселенское зло. |  22 октября 2009, 18:11: Вопрос перемещён из тематического раздела Pascal » Программирование на Pascal в раздел Лабораторный практикум модератором Ерёмин А.А. Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |