Почему программа считает неправильно?

На идеально гладкой горизонтальной поверхности неподвижно стоит куб с массой m1. Неподалеку от куба возвышается стена, плоскость которой параллельна одной из боковых граней куба. С противоположной от стены стороны с некоторой скоростью скользит в направлении стены куб с массой m2 ,. Скорость перпендикулярна к стене и боковым граням обоих кубов Все удары абсолютно упругие. Понятно, что после столкновения первый куб начнет скользить в направлении стены, после чего отразится. и, вероятно, еще раз столкнется с другим. Вам нужно определить общее количество столкновений, которые состоятся в системе. Программа читает с устройства стандартного ввода два целых числа m1 и m2 - массы кубов (1 ≤ m1 ≤ m2 ≤ 103). Программа выводит единственное целое число - количество ударов.

Ссылка на решение. Почему программа считает неправильно?

#include<iostream>
#include<math.h>
#define PI 3.14159265
using namespace std;
int main() {
    int m1, m2;
    int rez;
    cout << "Enter m1 і m2" << endl;
    cin >> m1 >> m2;
    if (m1 == m2) {
        rez = 3;
        cout << rez << endl;
    }
    else {
        double tan = sqrt(m1 / m2);
        rez = (PI / atan(sqrt(m1 / m2)));
        cout << rez << endl;
    }

    return 0;       
}

Ответы (1 шт):

Автор решения: Harry
#include <iostream>
#include <iomanip>

using namespace std;


int main()
{
    double m2, m;
    cin >> m >> m2;
    m = m2/m;

    int shock = 0;

    double v1 = 0, v2 = 1;

    for(;;)
    {
        double u1 = (v1*(1-m)+2*m*v2)/(1+m);
        double u2 = (2*v1-(1-m)*v2)/(1+m);
        shock++;
        if (u1 > 0) { u1 = -u1; shock++; }
        v1 = u1; v2 = u2;
        if (v2 <= 0 && v1 <= 0 && v2 <= v1) break;
    }
    cout << shock << endl;


}
→ Ссылка