Проблема с вычислением дробных значений в C++ (с использованием рациональных чисел)C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Проблема с вычислением дробных значений в C++ (с использованием рациональных чисел)

Сообщение Anonymous »


У меня возникла проблема с выполнением вычислений над дробными значениями в C++, и мне нужна помощь. После следующей последовательности действий:

Я получаю набор целых чисел. Я применяю операцию «половина» (деление наибольшего числа на 2 и возвращение его в набор) несколько раз в наборе. Выполнив определенное количество «половинных» операций, я хочу упростить результат до несократимой дроби. Проблема в том, что я получаю неверные результаты или округляю дробные значения.

Вот проблема:

"Дано множество натуральных чисел. Операция «половина» вычитает из множества наибольший элемент, делит его на две равные части и возвращает оба полученных числа в набор. Задача — найти наибольшее число из множества. набор после последовательного применения операции «половина». Формат ввода: Для каждого примера стандартный ввод предоставляет: количество элементов в наборе и элементы набора. Для каждого примера выведите полученное наибольшее число в виде целого числа или простая несократимая дробь (см. пример).

Ввод:

3 2 1 2 3 2 1000000 2 3 Выход:
3/2 1/131072 #include #include #include #include #include int НОД(int a, int b) { если (b == 0) вернуть a; return gcd(b, a % b); } void simpleFraction(int& numerator, int& denominator) { int commonFactor = НОД (числитель, знаменатель); числитель /= commonFactor; знаменатель / = общий коэффициент; } double findLargest(const std::vector& Numbers) { return *std::max_element(numbers.begin(), Numbers.end()); } std::vector applyHalf(const std::vector& Numbers) { двойной наибольший = findLargest (числа); std::vector updateNumbers; for (двойное число: числа) { if (num != наибольший) { обновленныеNumbers.push_back(num); } } обновленныеNumbers.push_back(самый большой/2); вернуть обновленные номера; } интервал основной() { интервал п, к; while (std::cin >> n >> k) { std::vector числа (n); for (int i = 0; i < n; i++) { std::cin >> числа; } for (int i = 0; i < k; i++) { числа = applyHalf (числа); } int numerator = static_cast(findLargest(numbers) * std::pow(2, k)); int знаменатель = static_cast(std::pow(2, k)); simpleFraction (числитель, знаменатель); std::cout
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»