Проблема с вычислением дробных значений в C++ (с использованием рациональных чисел) ⇐ C++
Проблема с вычислением дробных значений в C++ (с использованием рациональных чисел)
У меня возникла проблема с выполнением вычислений над дробными значениями в 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
У меня возникла проблема с выполнением вычислений над дробными значениями в 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
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение