C/C++

Программирование C++ / не могу решить задачу

Не пойму, почему ответ должен быть 8? И как сделать чтобы было 8?
Улитка

Улитка ползет по вертикальному шесту высотой H метров, поднимаясь за день на A метров, а за ночь спускаясь на B метров. На какой день улитка доползет до вершины шеста?

Формат входных данных

Программа получает на вход целые неотрицательные числа H, A, B, причем H > B. Числа не превосходят 100.

Формат выходных данных

Программа должна вывести одно натуральное число. Гарантируется, что A > B.

Sample Input:
10
3
2
Sample Output:
8

Мое решение:
#include <iostream>

using namespace std;

int main() {

int h, a, b;

cin >> h >> a >> b;

cout << h / (a - b);

return 0;
}
Если A>H, то доползёт в первый день, иначе
N - количество дней, за которые улитка доползёт
Она ползёт (N-1) суток, по (A-B) метров в сутки
и часть или целый день на X E (0; A] метров
Итого: математически три варианта
1)(H-A)<0 - доползёт в первый день N=1
2) (H-A)/(A-B) - целое => доползёт за N=(H-A)/(A-B)+1 дней.
3) (H-A)/(A-B) - рациональное >0 => доползёт менее, чем за
N=((H-A) делим на цело (A-B))+1 дней


Помимо (A>B и H>B) нужно проверить условие(A>H):


----------------------------------------------------------
Алгоритм:
Если A>H, то N=1
иначе N=((H-A) делим на цело на (A-B))+1
-------------------------------------------------------------
Проверка
H=10 A=3 B=2
A>H - нет, следовательно
N=((10-3) делим на цело на (3-2))+1=8
Ответ совпадает.
Евгений ______
Евгений ______
38 578
Лучший ответ
Потому что когда она доползла до верха - дальше не ползёт вниз. Последний рывок нужно считать отдельно, к примеру, 1 + (h - a) / (a - b) (при этом отдельно проверять, что h > a, иначе возвращать 1, дабы в минус не уйти)
А что - разве нельзя эту задачу решить при помощи хотя бы, например, итерационного цикла, да и вообще любым корректным методом, пусть и проигрывающий в скорости исполнения, но зато абсолютно надёжным вместо того, чтобы клепать какие-то невнятные и неверные формулы? Такой вот дополнительно-вспомогательный программный код всегда может пригодиться для проверки более толкового и эффективного варианта программы:
#include <iostream>
int main() { int h, height = 0, a, b, c = 0;
std::cin >> h >> a >> b; for(;;) { c++; height += a;
if (height >= h) break; height -= b; } std::cout <<
c << std::endl; cin.get(); cin.get(); return 0; }
ОК
Олег Квашнин
66 572
Олег Квашнин cin.get(); и return 0; тут, кстати, явно лишние, с cin.get(); как раз ничего работать не будет пока using namespace std; не поставить или не сделать std::cin.get();
Антон Васёв Ну да, математика нам не нужна. Лучше сделать цикл вместо одного уравнения.
Валера Опанасенко Нет, к сожалению нужно решить обычными целыми числами
Залезет ли улитка за один день на 3-х метровый шест? Да, потому что сразу ползет на три метра вверх. А значит формула подьема - h = a + (a-b)*day
тоесть высота = высота дневного подьема + ежедневное приращение * количество дней
Sergei Medvedski
Sergei Medvedski
51 416