Особенности представления и работы с действительными числами
Десятичный мир
Для начала представим себе, что данные в компьютерах хранятся в ячейках-"битах", каждое из которых может принимать 10 разных значений.
В таком случае очень легко хранить положительные целые числа: каждое число по цифрам записывается в ячейки памяти.
Реальный процессор может выполнять арифметические с такими числами, но есть проблема:
чем больше цифр в числах, которые он сможет складывать за одну операцию (такт), тем сложнее его проектировать, тем больше тепла он выделяет и энергии потребляет.
Поэтому необходимо выбрать некоторое фиксированную "стандартную" длину чисел так, чтобы с одной стороны для большей части основных задач числа туда помещались, с другой стороны были наиболее короткими.
Например, можно выбрать длину в 10 цифр для "обычных" чисел и длину 20 для "длинных" (операций с длинными целыми числами за один такт процессора будет выполняться меньше).
Кстати, нам потребуется хранить ещё и знак числа.
Как лучше всего это сделать — вопрос очень хороший.
Для простоты можно считать, что знак мы храним в старшей цифре: если старшая цифра 0, то число положительное, если 1 — то отрицательное.
Целые числа и дополнение до 10
В реальности используется несколько подходов к хранению знака числа, вернее даже к хранению просто целых чисел.
Самый "популярный" в данный момент называется "дополнение до двойки" (two’s complement), что для нашего воображаемого десятичного процессора превращается в "дополнение до десятки".
Основная идея подхода состоит в следующем.
Так как наши числа ограничены 10-ю цифрами, то если в результате арифметической операции возникнет перенос через разряд в 11-ю цифру, то он будет потерян.
В таких случаях говорят, что вычисления производятся по модулю $10^{10}$.
Пусть у нас есть два числа: отрицательное $x$ и положительное $y$, и нам нужно вычислить $x+y$.
Заметим, что по замечанию выше $x+y\equiv (10^{10}+x) + y$ (ведь добавление лишнего $10^{10}$ ничего не меняет, у нас нет "места", чтобы хранить эту цифру).
Но число $(10^{10}+x)$ уже заведомо положительное.
Итак, ровно в этом состоит идея: для хранения отрицательного числа $x$ используется положительное число $(10^{10}+x)$.
Неотрицательные числа от 0000000000 до 4999999999 хранятся как есть.
А числа от 5000000000 до 9999999999 отдаются отрицательным числам,
причём $-1$ превращается в $10^{10}-1 = 9999999999$, $-2$ превращается в $10^{10}-2 = 9999999998$, и так далее,
$-5000000000$ превращается в... в $-5000000000$.
Заметим, что отрицательных чисел "поместилось" на одно больше, чем положительных.
В чём выгода такого подхода? Во-первых, используются все возможные значения (если знак хранить в первой цифре, то будут "потеряны" 80% чисел).
Во-вторых, с таким подходом отрицательные числа ничем не отличаются от положительных и не требуется усложнения схем для организации арифметических операций с ними. По модулю $10^{10}$ отлично работают все арифметические операции, поэтому работать будут и вычитание, и умножение.
В реальных чипах используется двоичная система счисления, но в остальном всё устроенно именно так.
Один бит — это двоичная цифра. И существуют числа разной длины — в 8, 16, 32 и 64 двоичных цифры.
Это зависит от реальных чипов.
Итак, мы научились хранить целые числа.
А как хранить действительные числа?
Можно, например, хранить десять цифр целой части и десять цифр дробной.
Идея очень простая, но не очень полноценная.
Обычное число Авогадро $6.02\cdot10^{23}$ записать уже не получится.
Можно было хранить числитель и знаменатель дроби (рационального числа).
Но кроме множества проблем это не решает проблемы с $6.02\cdot10^{23}$ (ведь придётся хранить очень большое число, а, значит, нужно хранить много цифр).
Но если нужно уметь работать с числами вида $6.02\cdot10^{23}$, то может быть прямо так и хранить?
Скажем, хранить 15 цифр числа (плюс 1 цифра на знак) и 3 цифры степени (плюс снова 1 цифра на знак степени), в сумме 20 цифр, или "стандартное" длинное число.
В этом случае станет возможно работать с числами от $10^{-999}$ до $10^{999}$ с точностью 15 значащих цифр.
Значащие цифры в такой записи называются мантиссой, а степень — экспонентой.
Число Авогадро при этом можно было бы записать как $602\cdot10^{21}$.
Заметим, что число Авогадро в виде $x\cdot 10^n$ может быть записано по-разному: и как $6.02\cdot10^{23}$, и как $0.602\cdot10^{24}$, и как $602\cdot10^{21}$,
и даже парой совсем неудобных способов: $60200000000000\cdot10^{10}$, $0.000000602\cdot10^{30}$.
Желательно выбрать из всех таких представлений одно (каноническое).
Кажется заманчивым хранить мантиссу в виде обычного целого числа, например хранить число Авогадро в виде $602\cdot10^{21}$.
Но это не очень хорошо: в такой записи числа очень неудобно сравнивать: например попробуйте сравнить число Авогадро с числами $6\cdot10^{23}$, $62\cdot10^{22}$, $6021\cdot10^{20}$ или $60199999999999\cdot10^{10}$.
Чтобы числа было удобно сравнивать (и ещё по нескольким причинам), используют следующий подход.
Положительное число всегда можно домножить на такую степень десятки, чтобы целая часть лежала от 1 до 9.
Ровно такое представление и используют для записи, оно называется нормализованным.
Итак, каждое ненулевое число может быть представлено в нормализованном виде
$\pm \overline{a_0,a_1a_2\ldots a_{13}\ldots}\cdot 10^n$, где $a_0\ne0$.
И примерно в этом виде его можно и хранить: знак числа, целая часть, 14 цифр после запятой, знак степени, три цифры степени, в сумме 20 цифр.
Сравнивать числа в такой записи очень просто: например, если числа положительны, то нужно сначала сравнить показатели степени, а в случае, если они равны, сравнить мантиссы.
Кстати, мы ещё пропустили число 0.
Его обычно хранят в виде $0\cdot10^0$, тогда для сравнения его с другими числами не потребуется дополнительных ухищрений.
Реальный двоичный мир
В реальности используются двоичные процессоры.
Однако с точки зрения идей в них всё устроено так же, как в описанном выше десятичном случае.
Использование двоичной системы счисления для действительных чисел создаёт некоторые дополнительные особенности при работе с ними, однако с ними мы познакомимся чуть позже.
Действительные числа в питоне
В питоне для хранения действительных чисел используется тип float.
Если вы хотите считать с клавиатуры действительное
число, то результат, возращаемый функцией input() необходимо
преобразовывать к типу float:
x = float(input())
Действительные (вещественные) числа представляются в виде чисел с десятичной точкой (а не запятой, как принято
при записи десятичных дробей в русский текстах). Для записи очень больших или очень маленьких
по модулю чисел используется так называемая запись «с плавающей точкой»
(также называемая «научная» запись). В этом случае число представляется в виде
некоторой десятичной дроби, называемой мантиссой, умноженной на целочисленную степень десяти
(порядок или экспонента). Например, расстояние от Земли
до Солнца равно 1.496·1011м, а масса молекулы воды 2.99·10-23кг.
Числа с плавающей точкой в программах на языке Питон, а также при вводе и выводе записываются
в виде мантиссы, затем пишется буква e, затем пишется порядок. Пробелы внутри этой
записи не ставятся. Например, указанные выше константы можно записать в виде
1.496e11 и 2.99e-23. Перед самим числом также может стоять знак минус.
При этом запись числа при вводе не обязана быть нормализованной, выражение 17900e-2 также корректно.
Напомним, что результатом операции деления / всегда является действительное число,
в то время как результатом операции // является целое число.
Преобразование действительных чисел к целому производится с округлением
в сторону нуля, то есть int(1.7) == 1, int(-1.7) == -1.
С действительными числами также работает операция целочисленного деления //,
однако если хотя бы одно из чисел (числитель или знаменатель) действительное, то результат операции будет целым действительным числом.
Если числа x и y положительны, то x//y — это то, сколько раз число y умещается в x.
Например, 0.7//0.2=3.0, 17.9//1=17.0.
В общем же случае x//y — это такое целое число $q$ (в формате float), что $0 \leq x-y\cdot q < |y|$.
Упражнения
A: Сумма целых частей
Даны два действительных числа.
Выведите сумму их целых частей.
1.99
2.99
3
Для решения этой задачи не требуется ничего, кроме арифметических операций и функций float() и int().
Проверьте, как работает ваша программа, если на вход дать отрицательные числа.
IDE
B: Первая цифра после точки
Дано положительное действительное число X. Выведите его первую цифру после десятичной точки.
При решении этой задачи нельзя пользоваться условной инструкцией и циклом.
Можно использовать только арифметику и функции float() и int().
1.79
7
IDE
C: Округление по российским правилам
По российский правилам числа округляются до ближайшего целого числа,
а если дробная часть числа равна 0.5, то число округляется вверх.
Дано число x, округлите его по этим правилам.
Разрешается использовать только арифметические операции и функции float() и int().
2.3
2
2.5
3
Проверьте, как работает ваша программа, если на вход дать отрицательное число.
Суровая правда
Скорее всего ваше простое решение не работает в хитрых случаях.
Проверьте на числах -2.4, 0.49999999999999994, 5000000000000001.0.
Просто знайте, что получать точный результат с действительными числами правда сложно.
IDE
Сниппеты для ускорения набора кода
Наверняка вы уже столкнулись с тем, что одни и те же куски кода повторяются очень часто.
Например, int(input()) или float(input()) или for i in range(...):.
Если вы используете PyCharm, то ввод этого кода можно здорово ускорить при помощи сниппетов — live templates.
На скриншотах ниже последовательность для настройки.
После этого можно будет ввести ii и нажать клавишу tab — и вуаля!
live templates в PyCharm
В результате ввод простой программы может выглядеть как-то так:
D: Площадь треугольника
Даны длины сторон треугольника. Вычислите площадь треугольника при помощи формулы Герона.
3
4
5
6.0
1
1
1
0.4330127018922193
IDE
E: Часы - 1
С начала суток прошло \(H\) часов, \(M\) минут, \(S\) секунд (\(0\le H <12\), \(0\le M < 60\), \(0\le S < 60\)).
По данным числам \(H\), \(M\), \(S\) определите угол (в градусах), на который повернулаcь часовая стрелка
с начала суток и выведите его в виде действительного числа.
При решении этой задачи нельзя пользоваться условными инструкциями и циклами.
1
2
6
31.05
Подсказка
Я уже несколько минут подумал и всё равно ничего не понимаю
Каждый час даёт $1/12$ оборота, каждая минута — $1/(12\cdot60)$ оборота, а каждая секунда — $1/(12\cdot60\cdot60)$ оборота.
А полный оборот — это 360 градусов.
IDE
F: Часы - 2
С начала суток часовая стрелка повернулась на угол в \(\alpha\) градусов. Определите
на какой угол повернулась минутная стрелка с начала последнего часа.
Входные и выходные данные — действительные числа.
При решении этой задачи нельзя пользоваться условными инструкциями и циклами.
190
120.0
Подсказка
Я уже несколько минут подумал и всё равно ничего не понимаю
Во сколько раз быстрее часовой вращается минутная стрелка?
IDE
FA: Сумма обратных кубов двумя способами
Вычислите двумя способами сумму \(1+\displaystyle\frac{1}{2^3}+\displaystyle\frac{1}{3^3}+...+\displaystyle\frac{1}{n^3}\).
Первый способ - суммированием от 1 до $n$, второй - суммированием от $n$ до 1. Выведите оба результата.
5
1.185662037037037
1.185662037037037
IDE
FB: От перемены мест слагаемых сумма...
Вычислите двумя способами сумму \(1+\displaystyle\frac{1}{2^3}+\displaystyle\frac{1}{3^3}+...+\displaystyle\frac{1}{n^3}\).
Первый способ - суммированием от 1 до $n$, второй - суммированием от $n$ до 1. Посчитайте каждым способом два значения: для $n=10^k$ и для $n=10^k + 10$ при k, равном 1, 2, 3... Выведите полученные суммы обратных кубов и их разность (числа k удобней перебирать вручную).
Ответьте на вопросы и отправьте своё рассуждение в проверяющую систему (используйте результат работы программы):
1) При каких n суммы обратных кубов, посчитанные разными способами, получаются различными?
2) При каких примерно n одна из сумм продолжает меняться, а другая - уже нет?
3) Какой способ суммирования даёт более точный результат? Почему вы так решили?
4) Попробуйте объяснить причину расхождений (перечитайте ещё раз про хранение в памяти компьютера действительных чисел).
Это, наверное, из-за того, что числа очень маленькие. С большими точно всё будет в порядке!
Вычислите int(float(10**k)+1) или round(float(10**k)+1) для k от 14 до 17. Что не так?
Убедитесь, что если не выходить из целых чисел, то всё будет хорошо.
Не связывайтесь с действительными числами, если ответ нужен точный!
В задачах, связанных с финансами, всегда требуется точный ответ.
Нельзя терять копейки.
Когда ответ требуется точный, то связываться с действительными числами (типом float) супер-опасно.
Чтобы убедиться в этом, проверьте:
С точными вычислениями с действительными числами мы ещё встретимся.
И разберёмся, почему происходит вот эта вот дичь.
А в следующих двух задачах нужно избежать использования float'ов.
И как можно скорее перейти к целым: в данном случае к число секунд в 12 часах или к копейкам.
Впрочем, можете попробовать сначала не прислушиваться к этому совету :)
G: Часы - 3
С начала суток часовая стрелка повернулась на угол в \(\alpha\) градусов. Определите
сколько полных часов, минут и секунд прошло с начала суток, то есть решите
задачу, обратную задаче E.
Запишите ответ в три переменные и выведите их на экран.
При решении этой задачи нельзя пользоваться условными инструкциями и циклами.
31.05
1 2 6
Подсказка
С некоторыми тестами происходит какая-то дичь
360 градусов — это 3600 × 12 секунд.
Значит $x$ градусов — это $[x \times 120]$ полных секунд с начала суток.
Дальше уже только целочисленная арифметика.
IDE
H: Проценты
Процентная ставка по вкладу составляет P процентов годовых, которые прибавляются к сумме вклада.
Вклад составляет X рублей Y копеек. Определите размер вклада через год.
Программа получает на вход целые числа P, X, Y и должна вывести два числа: величину
вклада через год в рублях и копейках. Дробная часть копеек отбрасывается.
При решении этой задачи нельзя пользоваться условными инструкциями и циклами.
12
179
0
200 48
Эта задача находится в листке про действительные числа, но решать её нужно, используя целые.
Открыть после решения или при наличии проблем
Строго после решения или при наличии проблем
Если не учитывать то, что копейки отбрасываются, то фраза «P процентов годовых» означает, что через год на вкладе будет сумма $x + x\cdot P/100 = (1+P/100)\cdot x$.
Чтобы избежать неправильных округлений действительных чисел удобно вести все расчёты в целых копейках, тогда деление на 100 исчезнет.
IDE
M: 𝜋2/6
По данному числу n вычислите сумму
\(1+\displaystyle\frac{1}{2^2}+\displaystyle\frac{1}{3^2}+...+\displaystyle\frac{1}{n^2}\).
3
1.3611111111111112
Знаете ли вы, что этот ряд сходится к \(\pi^2/6\)?
IDE
N: ln 2
По данному числу n вычислите сумму
\(1-\displaystyle\frac12+\displaystyle\frac13-\displaystyle\frac14++...+\displaystyle\frac{(-1)^{n+1}}{n}\).
Операцией возведения в степень пользоваться нельзя. Алгоритм должен
иметь сложность O(n). Попробуйте также обойтись без использования инструкции if.
3
0.8333333333333333
Этот ряд сходится к значению ln 2.
IDE
O: Геометрическая прогрессия
Забудьте формулу суммы геометрической прогрессии и вычислите сумму
\(1+x+x^2+...+x^n\).
Программа получает на вход целое число n и действительное число x.
Операцией возведения в степень пользоваться нельзя. Алгоритм должен
иметь сложность O(n) (то есть должен содержать только один цикл).
4
0.1
1.1111
IDE
P: Просто 𝜋
По данному числу n вычислите сумму
\( 4\left(1-\displaystyle\frac13+\displaystyle\frac15-\displaystyle\frac17+...+\displaystyle\frac{(-1)^n}{2n+1}\right)\)
Операцией возведения в степень пользоваться нельзя.
Алгоритм должен иметь сложность O(n).
2
3.466666666666667
Этот ряд сходится к числу \(\pi\).
IDE
Библиотека random
В компьютерных программах нередко требуется эмуляция случайности. Но в программировании настоящей случайности нет. Неоткуда взяться произвольному числу, нельзя запрограммировать его появление из ниоткуда. Можно лишь создать программу, которая в результате применения сложной формулы к исходному числу ("зерну") будет выдавать число, и нам будет казаться, что это число случайно. Подобную программу называют генератором псевдослучайных чисел.
Функции, связанные с генерацией случайности, собраны в библиотеку (модуль), которая называется random. Основная функция из этой библиотеки, генерирующая последовательность псевдослучайных чисел, тоже носит название random. При каждом следующем вызове она даёт в ответе новое действительное число на интервале от 0 до 1. Если вызывать эту функцию очень много раз и изображать полученные числа точками на числовой прямой, то эти точки будут равномерно заполнять пространство отрезка (0, 1).
Для использования функции random в начале программы необходимо подключить её из
библиотеки, что делается командой
from random import random
После этого функцию random можно вызывать следующим образом (скобки обязательны!):
from random import random
n = 10
for i in rande(n):
print(random())
UA: Случайная последовательность из 0 и 1
Выведите случайную последовательность из 0 и 1 заданной длины (через пробел).
Из модуля random можно использовать только функцию random, другие функции использовать нельзя!
Функция random даёт числа, равномерно распределённые на интервале (0,1). Ваша программа должна использовать эту равномерность, чтобы гарантировать, что "монетка", которую вы кидаете, с равной вероятностью падает на любую из сторон.
5
1 0 1 1 0
UB: Случайная последовательность целых чисел
Даны числа $N$, $A ≤ B$.
Выведите случайную последовательность из целых чисел $x$: $A ≤ x ≤ B$ длины $N$.
Из модуля random можно использовать только функцию random, другие функции использовать нельзя!
Функция random даёт числа, равномерно распределённые на интервале (0,1). Ваша программа должна использовать эту равномерность, чтобы гарантировать, что "кубик", который вы кидаете, с равной вероятностью падает на любую из своих граней.
Что-то не так с отрицательными числами...
Обратите внимание, что int(x) и int(x // 1) работают по-разному для отрицательных нецелых x.
5
7
9
8 9 9 8 7
Библиотека math
Для проведения вычислений с действительными числами язык Питон содержит много
дополнительных функций, собранных в библиотеку (модуль), которая называется math.
Для использования этих функций в начале программы необходимо подключить математическую
библиотеку, что делается командой
import math
Функция от одного аргумента вызывается, например, так: math.sqrt(x)
(то есть явно указывается, что из модуля math используется функция sqrt (квадратный корень)).
Вместо числа x может быть любое число, переменная или выражение.
Функция возвращает значение, которое можно вывести на экран, присвоить
другой переменной или использовать в выражении:
y = math.sqrt(4)
print(math.sin(math.pi/2))
Другой способ использовать функции из библиотеки math, при котором не нужно будет
при каждом использовании функции из модуля math указывать название
этого модуля, выглядит так:
from math import sqrt, sin
y = sqrt(x)
print(sin(pi/2))
Другие способы импортировать функции из модулей
Если вместо списка конкретных функций, которые нужно импортировать, указать звёздочку, то будут загружены все функции.
Однако так лучше никогда не делать, потому что функции, импортированные из модуля, могут затирать уже существующие.
>>> print(pow(2, 3, 10))
8
>>> from math import *
>>> print(pow(2, 3, 10))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: pow expected 2 arguments, got 3
>>>
Если необходимо импортировать все функции, но хочется сократить код (имя math ещё достаточно короткое, могло бы быть имя TelegramBotPython, которое уж совсем громоздкое), то можно использовать следующий подход:
import math as mh
y = mh.sqrt(x)
print(mh.sin(mh.pi/2))
Ниже приведен список основных функций модуля math. Более подробное описание
этих функций можно найти на сайте с документацией на Питон.
Некоторые из перечисленных функций (int, round, abs)
являются стандартными и не требуют подключения модуля math для использования.
Функция
Описание
Пример
Округление
int(x)
Округляет число в сторону нуля. Это стандартная функция, для ее использования не нужно подключать модуль math.
int(17.9) == 17; int(-17.9) == -17
round(x)
Округляет число до ближайшего целого. Если дробная часть числа равна 0.5, то число округляется до ближайшего четного числа.
round(17.9) == 18; round(-17.9) == -18
round(x, n)
Округляет число x до n знаков после точки. Это стандартная функция, для ее использования не нужно подключать модуль math.
Округляет число вниз («пол»), при этом floor(1.5) == 1, floor(-1.5) == -2
floor(17.9) == 17; floor(-17.9) == -18
ceil(x)
Округляет число вверх («потолок»), при этом ceil(1.5) == 2, ceil(-1.5) == -1
ceil(17.9) == 18; ceil(-17.9) == -17
abs(x)
Модуль (абсолютная величина). Это — стандартная функция.
abs(17.9) == abs(-17.9) == 17.9
fabs(x)
Модуль (абсолютная величина). Эта функция всегда возвращает значение типа float.
fabs(-17) == 17.0
Корни, степени, логарифмы
sqrt(x)
Квадратный корень. Использование: sqrt(x)
sqrt(4) == 2; sqrt(10) == 3.1622776601683795
pow(a, b)
Возведение в степень, возвращает ab. Использование: pow(a,b). Одноимённая функция есть и среди стандартных, но работает она немного по-другому. В частности, у неё есть третий параметр, позволяющий вычислять степени по модулю числа. Например, последние три цифры степени без непосредственного её вычисления можно получить так: pow(179, 10000, 000)
Выше по тексту участвовали странные, возможно незнакомые слова.
Пока нет особой необходимости в них как следует разбираться, они много раз встретятся до 11-го класса,
однако вот их общий смысл.
Число $e$, или число Эйлера, — это замечательная математическая константа, у которого существует множество определений.
Например, площадь под графиком гиперболы $1/x$ от 1 до $e$ равна в точности 1.
Также если численность человечества каждый год увеличивалась в $e$ раз, то в любой момент времени число живых равнялось бы числу когда-либо живших до этого момента.
Экспонентой называется степень числа $e$.
Натуральный логарифм — это функция, обратная к экспоненте.
Более понятными являются двоичный и десятичный логарифмы: $\log_2a$ — это такое число, что $2^{\log_2a}=a$.
Аналогично определяется десятичный логарифм.
Заметим, что десятичный логарифм примерно равен числу цифр в записи целой части числа (может отличаться на 1),
а двоичный — числу цифр в двоичной записи (тоже может отличаться в пределах 1).
Функции синус, косинус, тангенс и т.д. называются тригонометрическими.
Рассмотрим окружность радиуса 1 с центром в нуле, а также положительное число $x$.
Возьмём нитку длины $x$, привяжем её к точке $(1,0)$ и намотаем на окружность против часовой стрелки.
Абцисса получившейся точки (координата по оси $Ox$) будет равна $\cos(x)$, а ордината — $\sin(x)$.
Баллистическая траектория
Пусть в момент времени 0 снаряд находится в точке с координатами \(x_0\) и \(y_0\) и имеет начальную скорость, компоненты которой вдоль осей равны \(V_{x0}\) и \(V_{y0}\) соответственно. Ускорение свободного падения равно \(g\). Тогда координаты снаряда в момент времени \(t\) можно найти по формулам:
$$x_t=x_0+t\cdot V_{x0}$$
$$y_t=y_0+t\cdot V_{y0}-\displaystyle\frac{g\cdot t^2}{2}$$
Эта кривая — парабола, ветви которой направлены вниз, проходящая через начальную точку $(x_0, y_0)$.
Если компоненты скорости вдоль осей равны \(V_{x}\) и \(V_{y}\), то модуль скорости равен $\sqrt{V_{x}^2+V_{y}^2}$, а угол, под которым летит снаряд равен $\text{atan}(V_{y}/V_{x})$ (арктангенс, пишется как arctg, в питоне atan).
Обратно, если снаряд летит со скоростью $V$ под углом $\alpha$, то компоненты скорости вдоль осей равны $V_{x} = V\cdot\cos(\alpha)$ и $V_{y} = V\cdot\sin(\alpha)$.
V: Баллистическая задача - 1
Самолет летит на высоте \(h\) метров со скоростью \(v\) м/c. Ему необходимо поразить бомбой цель.
На каком расстоянии \(x\) от цели (в метрах) необходимо выпустить бомбу?
Программа получает на вход вещественные числа \(h\) и \(v\) и должна вывести значение \(x\).
В этой и последующей задачах ускорение свободного падения \(g=9.8\), сопротивлением воздуха пренебречь.
1000
300
4285.714285714285
Непонятно, как вообще такое решать
Мы такого не проходили. Ничего не понимаю...
Начальная скорость по $x$ равна $v$, начальная скорость снаряда по $y$ — это $0$.
Начальная координата по $x$ равна $0$, по $y$ равна $h$.
Получаем уравнение движения:
$$
x_t = t \cdot v; \qquad y_t = h - \displaystyle\frac{g\cdot t^2}{2}
$$
Эта штука должна пройти через танк в точке $(x, 0)$.
Подставляем вместо эту точку вместо $x_t$ и $y_t$:
$$
x = t \cdot v; \qquad
0 = h - \displaystyle\frac{g\cdot t^2}{2}
$$
Решаем систему уравнений на бумажке, получаем выражение для $x$.