Задача. Дана рациональная дробь [latex]\frac{m}{n}[/latex]. Запишите её в виде десятичной дроби с точностью [latex] k[/latex] знаков после запятой.
Входные данные
В одной строке записано 3 числа [latex]m,n,k[/latex]. [latex]{{0}<{m,n}\leq{100}}[/latex], [latex]{{0}\leq{k}\leq{1000}}[/latex].
Выходные данные
Вывести [latex]k[/latex] точных значащих цифр после десятичной точки искомого числа.
Алгоритм решения:

Деление уголком
Код программы:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
#include <iostream> using namespace std; int main() { int m, n, k; cin >> m >> n >> k; cout << m / n << "."; for (int i = 0; i < k - 1; i ++) //вывод всех цифр после точки, кроме последней { m = (m % n) * 10; cout << m / n; } m = (m % n) * 10; int a = m / n; //считываем и запоминаем последнюю цифру cout << ((m % n) * 10 / n >=5 ? a + 1 : a); //проверяем идущую перед ней: больше 5 - увеличиваем последнюю на 1 и выводим, иначе - просто выводим return 0; } |
Проверка:
- (По условию задачи):
Ввод: | # | Вывод: |
m | 1 | 0.500 |
n | 2 | |
k | 3 |
2.
Ввод: | # | Вывод: |
m | 2 | 0.66666666666666666667 |
n | 3 | |
k | 20 |
3.
Ввод: | # | Вывод: |
m | 9 | 1.000000000 |
n | 9 | |
k | 9 |
4.
Ввод: | # | |
m | 1 | 0.33333333333333333333 |
n | 3 | |
k | 20 |
Здесь можно посмотреть решение на ideone.com
Здесь можно посмотреть условие задачи на e-olymp.com

— Деление (даже с двойной точностью) не позволит вычислить 1000 знаков после запятой. Мы это обсуждали на занятиях.
— Нужны правильные отступы.
— Что вы имеете в виду » Цикл for выполняет проверку для каждого из условий»?
— Вы пишите с помощью чего выполняются действия. И на этом заканчиваете. Это ничего по сути не объясняет. Например, «с помощью мела преподаватель решил задачу». Всё? После прочтения этой фразы читатель знает как решать все задачи?
— Что это за тесты? Сделайте хоть 1 3 20 и 2 3 20, тогда посмотрим.
— «библиотека, дроби, точки, числа» — это Вы про деление уголком (столбиком) так думаете?
Спасибо, Игорь Евгеньевич, что указали мне на ошибки, я их исправила
Катя, Вы не исправляете все ошибки и мне приходится повторять.
– Нужны правильные отступы. Если Вы не поняли, как их расставлять, посмотрите здесь на возможные варианты.
— Тест про 1/6 содержит ошибку в последнем знаке. Последняя цифра должна быть на 1 больше, если отбрасываемая часть больше половины единицы последнего оставленного разряда.
— Алгоритм деления в столбик описан очень путано. Я проверил на живых людях. Никто из испытуемых не понял о чём идёт речь. Может Вам стоит посмотреть или почитать как это объясняют другие? Понятно, что Вы сами понимаете, но нужно уметь изложить свою мысль. Только, пожалуйста, не копируйте чужие тексты — напишите хорошо сами.
Игорь Евгеньевич, я исправила ошибки, проверьте, пожалуйста
Лучше внимательно перечитать замечания и исправить их, чем ждать пока я проверю и скопирую старые замечания в новый комментарий.
— – «Что это за тесты? Сделайте хоть 1 3 20 и 2 3 20, тогда посмотрим.» В ответ Вы 2 3 20 сделали, молодец. Теперь жду 1 3 20.
— Если удалить бессмысленные тексты п.п. 1 и 2, то работа только выиграет. На мой взгляд.
Исправила работа с учетом Ваших замечаний, проверьте, пожалуйста
Хорошо. Зачтено.
Хотя условие в 16-й строке можно сделать проще чем ((m % n) * 10 / n >=5.
Данная задача решена неверно. К примеру при m = 56 n = 76 k = 3 ответ должен быть равен 0.736, но при использовании, приведённого на сайте решения, он округляется до 0.737. Данный код также не проходит тесты на e-olymp.com. Предлагаю такое решение задачи:
У Вас точно такое же решение. Только без округления.
В какой-то момент авторы задачи откорректировали тесты.
Еще одно последствие корректировки — в настоящий момент тесты требуют наличия пустой вывода символа конца строки в конце.