Как вывести дробь вместо десятичного числа? - PullRequest
8 голосов
/ 27 января 2011

В C ++, когда я вычисляю 2/3, он будет выводить десятичные значения, как я могу просто получить исходный формат (например, 2/3) вместо 0,66666667

Спасибо

Ответы [ 13 ]

10 голосов
/ 27 января 2011

Вы не можете.Вам нужно написать класс, предназначенный для хранения рациональных чисел (то есть дробей).Или, может быть, просто используйте библиотеку Boost Rational Number .

8 голосов
/ 27 января 2011

Если я правильно понимаю, у вас есть число с плавающей запятой (переменная типа float или double), и вы хотите вывести это значение в виде дроби.

Если этоВ этом случае вам необходимо дополнительно задать свой вопрос:

  • Число FP равно дробь, по определению: Число FP состоит из двух целых чисел, мантисса m и показатель степени e (и знак, но здесь это не имеет значения).Таким образом, каждое число FP на самом деле представляет собой пару (m, e) , и значение f , которое оно представляет, равно f = mb ^ e (где b является фиксированной интегральной базой, обычно 2).Таким образом, естественное представление в виде дроби просто m / b ^ (- e) с e <0 </em> (если e> = 0 , f в любом случае является целым числом).
  • Однако вы, вероятно, хотите получить дробь с наименьшим разумным делителем .Это другой вопрос.Чтобы получить это, вы можете, например, использовать функцию bestappr из библиотеки Pari / GP.В вашем случае вы, вероятно, использовали бы bestappr(x, A), с x вашим вводом и A наибольшим знаменателем, который вы хотите попробовать.bestappr даст вам дробь, ближайшую к x , знаменатель которой все еще меньше, чем A .
6 голосов
/ 27 января 2011

написать свой собственный класс Rational для вычисления делений

class Rational
{
public:
    int numerator, denominator;

    Rational(int num, int den=1){
        numerator = num;
        denominator=den;
    }
    Rational(Rational other){
        numerator = other.numerator;
        denominator = other.denominator;
    }
    double operator / (int divisor){
            denominator *= divisor;
            simplificate();
            return getrealformat();
    }
    Rational& operator / (int divisor){
            denominator *= divisor;
            simplificate();
            return this;
    }
    Rational& operator / (Rational &divisor){
            numerator *= divisor.numerator;
            denominator *= divisor.denominator;
            simplificate();
            return this;
    }
    double operator / (int divisor){
            denominator *= divisor;
            simplificate();
        return getrealformat();
    }
    double getrealformat(){
        return numerator/denominator;
    }
    simplificate(){
        int commondivisor = 1;
        for(int i=2;i<=min(abs(numerator), abs(denominator));i++)
            if( numerator%i == 0 && denominator%i == 0 )
                commondivisor = i;
        numerator /= commondivisor;
        denominator /= commondivisor;
    }
};

использование

Rational r1(45), r2(90), r3=r1/r2;
cout<<r3.numerator<<'/'<<r3.denominator;
cout<<r3.getrealformat();
4 голосов
/ 27 января 2011

Вы должны хранить их в каком-то классе Fraction с двумя целочисленными полями.Конечно, вы должны упростить дробь, прежде чем использовать ее для вывода.

Вы можете разработать свой собственный класс или использовать некоторые библиотеки, такие как эта, для точной математики: CLN - Библиотека классов для чисел

4 голосов
/ 27 января 2011

как мне просто получить оригинальный формат (т.е. 2/3) вместо 0,66666667

Только с большим трудом оборачивая что-то вроде библиотеки GMP с пользовательскими операторами вывода. Ниже немного больше о GMP:

Что такое GMP?

GMP - бесплатная библиотека для арифметика произвольной точности, работает на целых числах со знаком, рационально числа и числа с плавающей запятой. Нет практического ограничения точность, кроме тех, которые подразумеваются доступная память в машине GMP работает. GMP имеет богатый набор функции, и функции имеют обычный интерфейс.

Основные целевые приложения для GMP криптографические приложения и исследования, интернет-безопасность приложения, алгебраические системы, исследование вычислительной алгебры и др.

GMP тщательно разработан, чтобы быть максимально быстро, как для маленьких операнды и для огромных операндов. скорость достигается с помощью полных слов в качестве основного арифметического типа, используя быстрые алгоритмы с высоко оптимизированным ассемблерный код для самых распространенных внутренние циклы для многих процессоров и общий акцент на скорости.

GMP быстрее, чем любой другой bignum библиотека. Преимущество для GMP увеличивается с размерами операнда для много операций, так как GMP использует асимптотически более быстрые алгоритмы.

Первый выпуск GMP был сделан в 1991. Он постоянно развивается и поддерживается, с новым выпуском о один раз в год.

3 голосов
/ 27 января 2011

В целом это невозможно: числа с плавающей запятой не точны и не содержат достаточной информации для полного восстановления дроби.

Однако вы могли бы написать функцию, которая эвристически находит «оптимальное» приближение, при котором предпочтительны дроби с маленькими числителями и знаменателями, а также дроби, которые имеют почти то же значение, что и число с плавающей запятой.

Если вы полностью контролируете код, идея Оли лучше: сначала не выбрасывайте информацию.

2 голосов
/ 27 января 2011

Чтобы упростить усилия, я предлагаю вам придерживаться известных знаменателей, если это возможно.

Я работаю с приложением, в котором дроби ограничены знаменателями степеней 2 или с использованием 3 (для третей).

Я конвертирую в эти дроби, используя приближение (округление до ближайшего 1,0 / 24,0).

Без каких-либо ограничений поиск знаменателя может быть довольно трудоемким занятием и отнимать много времени на выполнение.

2 голосов
/ 27 января 2011

Вы можете хранить все числители и знаменатели вашей дроби как целые числа.Целые числа имеют точные представления в двоичном формате.

0 голосов
/ 18 марта 2018

Используйте концепцию наибольших общих делителей.

если мы разделим числа с gcd их чисел, мы получим наименьшее возможное значение из них. Например: -

#define si long long
int main() {
si int total=4;
si int count=2;
si int g= __gcd(count,total);
count/=g;
total/=g;
cout<<count<<"/"<<total<<endl;
}
for more reference check out this:-https://www.codechef.com/viewsolution/17873537
0 голосов
/ 07 октября 2015
#include <iostream>
using namespace std;

int main() {
    int a,b,q,r;
    cin>>a>>b;//first number and second number
    q = a/b;
    r = a-q*b;
    cout<<q<<" "<<r<<" "<<"/"<<" "<<b<<"\n";
    return 0;
}

Я просто получил частное от a / b, а затем получил остаток от a-q * b открыт для предложений, если таковые имеются.

...