Язык: C++ Реализовать программу с форматированным определенным образом выводом. Допустим,...

0 голосов
92 просмотров

Язык: C++ Реализовать программу с форматированным определенным образом выводом. Допустим, выводим результат деления a на b: Входные данные: 3 2 Вывод: 1.5 Входные данные: 8 9 Вывод: \frac{8}{9} По сути: если получившееся число можно представить в виде десятичной дроби без периода, то выводим в виде десятичной. Если нет (например, 8/9=8,8(8)) - в виде обыкновенной.


Информатика (3.5k баллов) | 92 просмотров
Дан 1 ответ
0 голосов

Привожу 2 варианта решения.

Вариант 1: файл 1.cpp

Решение основано на обыкновенном вычислении периода дроби (для дробей, имеющих конечную десятичную запись(например, 1/2=0,5), период вычисляется для формы с нулем в периоде(то есть для 1/2 берется форма 0,5(0))) с помощью деления столбиком.

Замечание: сам алгоритм деления в столбик я писал достаточно давно, и для других программ, поэтому его реализация в данном коде может быть неоптимальной (в плане памяти или кол-ва операций), однако он работает.

Вариант 2: файл 3.cpp

Если немного углубиться в математику, можно найти теорему, по которой дробь, представленная в виде m/n , где НОД(m, n) = 1, имеет конечную десятичную запись тогда и только тогда, когда ее знаменатель n = 5^{a_1}*2^{a_2}; a_1, a_2\in Z, a_1, a_2\geq0. Тогда достаточно сократить числитель и знаменатель на общие множители, а далее выполнить проверку знаменателя.

(11.0k баллов)
0

они - числа

0

Также, в первом решении даже в экспоненциальной форме не выводится деление 10 на 2^40. Данную проблему я решил просто изменив типы данных основных переменных на long long. Но и этот вариант не проходит при делении 10 на 2^80, но думаю это уже мелочи и в ближайшее время это не будет особо важным.

0

Во втором решении 1 ошибка та же. Ну можно просто сделать просто дополнительную проверку при вводе. 2 ошибка тоже та же. Только тут уже ее так просто не исправить (ошибочным при 2^40 становится не ответ), при вводе данного значение не может инициализироваться массив (слишком большой).

0

значения*

0

Стек переполняется, видимо

0

Я подумаю, можно ли это исправить без ввода строк и длинной арифметики. Пока что ничего в голову не идет

0

Да, по поводу 2^80 - вроде бы это уже выход за пределы long long

0

Да. long long - чуть больше, чем 9*10^18

0

Там будет около 25 цифр, а у long long не более 19

0

Ну, пока что еще не возникало в задачах решений, требующих более, чем 10/2^40. Так что сейчас первого решения достаточно.