fork download
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. struct List1 {
  6. double time;
  7. List1* next;
  8. };
  9.  
  10. struct List2 {
  11. double time;
  12. List2* next;
  13. };
  14.  
  15. List1* push(double time, List1* tail) {
  16. return new List1{time,tail};
  17. }
  18.  
  19. List2* push(double time, List2* tail) {
  20. return new List2{time,tail};
  21. }
  22.  
  23.  
  24. List1* reverse(List1* rev) {
  25. List1* a = nullptr;
  26. while(rev) {
  27. List1 *b = rev -> next;
  28. rev -> next = a;
  29. a = rev;
  30. rev = b;
  31. }
  32. return a;
  33. }
  34.  
  35. List2* reverse(List2* rev) {
  36. List2* c = nullptr;
  37. while(rev) {
  38. List2 *d = rev -> next;
  39. rev -> next = c;
  40. c = rev;
  41. rev = d;
  42. }
  43. return c;
  44. }
  45.  
  46.  
  47. void destroy(List1* list1, List2* list2) {
  48. while (list1 != 0 && list2) {
  49. List1* x = list1 -> next;
  50. List2* n = list2 -> next;
  51.  
  52. cout << "прошло " << list1 -> time << " с., расстояние между телом и плоскостью теперь " << list2 -> time << " м." << endl;
  53.  
  54. delete list2, list1;
  55. list2 = n;
  56. list1 = x;
  57. }
  58. }
  59.  
  60.  
  61. int main() {
  62. double s, v1, v2, t; // расстояние между телом и плоскостью, скорость тела, скорость плоскости, время столкновения
  63. double x = 0, t1 = 0; // начальные координата тела и время
  64.  
  65. List2 * list2 = new List2;
  66. List1 * list1 = new List1;
  67.  
  68. cin >> s;
  69. cin >> v1;
  70. cin >> v2;
  71.  
  72.  
  73. if (v1 <= v2) {
  74. cout << "тело никогда не столкнётся с плоскостью";
  75. }
  76.  
  77.  
  78. else {
  79.  
  80. while (s > 0.000001) {
  81. // s стремится к нулю, но никогда не примет это значение => берём s как можно ближе к 0, считая, что в это время тело и плоскость уже столкнутся
  82. list2 = push(s, list2);
  83. list1 = push(t, list1);
  84.  
  85. x += s;
  86. t1 = s/v1;
  87. t += t1;
  88. s = v2*t1;
  89.  
  90. }
  91.  
  92. list2 = push(s,list2);
  93. list1 = push(t,list1);
  94.  
  95. list2 = reverse(list2);
  96. list1 = reverse(list1);
  97.  
  98. destroy(list1, list2);
  99.  
  100. cout << "спустя " << t << " с. тело столкнулось с плоскостью, преодолев " << x << " м." << endl;
  101.  
  102. }
  103.  
  104. return 0;
  105. }
Success #stdin #stdout 0s 4368KB
stdin
20
10
5
stdout
прошло 0 с., расстояние между телом и плоскостью теперь 0 м.
прошло 4.64467e-310 с., расстояние между телом и плоскостью теперь 20 м.
прошло 2 с., расстояние между телом и плоскостью теперь 10 м.
прошло 3 с., расстояние между телом и плоскостью теперь 5 м.
прошло 3.5 с., расстояние между телом и плоскостью теперь 2.5 м.
прошло 3.75 с., расстояние между телом и плоскостью теперь 1.25 м.
прошло 3.875 с., расстояние между телом и плоскостью теперь 0.625 м.
прошло 3.9375 с., расстояние между телом и плоскостью теперь 0.3125 м.
прошло 3.96875 с., расстояние между телом и плоскостью теперь 0.15625 м.
прошло 3.98438 с., расстояние между телом и плоскостью теперь 0.078125 м.
прошло 3.99219 с., расстояние между телом и плоскостью теперь 0.0390625 м.
прошло 3.99609 с., расстояние между телом и плоскостью теперь 0.0195312 м.
прошло 3.99805 с., расстояние между телом и плоскостью теперь 0.00976562 м.
прошло 3.99902 с., расстояние между телом и плоскостью теперь 0.00488281 м.
прошло 3.99951 с., расстояние между телом и плоскостью теперь 0.00244141 м.
прошло 3.99976 с., расстояние между телом и плоскостью теперь 0.0012207 м.
прошло 3.99988 с., расстояние между телом и плоскостью теперь 0.000610352 м.
прошло 3.99994 с., расстояние между телом и плоскостью теперь 0.000305176 м.
прошло 3.99997 с., расстояние между телом и плоскостью теперь 0.000152588 м.
прошло 3.99998 с., расстояние между телом и плоскостью теперь 7.62939e-05 м.
прошло 3.99999 с., расстояние между телом и плоскостью теперь 3.8147e-05 м.
прошло 4 с., расстояние между телом и плоскостью теперь 1.90735e-05 м.
прошло 4 с., расстояние между телом и плоскостью теперь 9.53674e-06 м.
прошло 4 с., расстояние между телом и плоскостью теперь 4.76837e-06 м.
прошло 4 с., расстояние между телом и плоскостью теперь 2.38419e-06 м.
прошло 4 с., расстояние между телом и плоскостью теперь 1.19209e-06 м.
прошло 4 с., расстояние между телом и плоскостью теперь 5.96046e-07 м.
спустя 4 с. тело столкнулось с плоскостью, преодолев 40 м.