Как вывести дробь вместо десятичного числа?

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

спасибо

13 ответов


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


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

Если это так, вам нужно уточнить свой вопрос:

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

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

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();

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

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

что такое GMP?

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

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

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

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

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


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

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


Это вообще невозможно: числа с плавающей запятой не точны и не сохраняют достаточной информации для полной реконструкции дроби.

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

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


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


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

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

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

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


Я новичок, и этот способ, который я использую, может быть неправильным способом

#include <iostream>

using namespace std;
int main ()
{
  double a;
  double b;
  double c;

  cout << "first number: ";
  cin >> a;
  cout << "second number: ";
  cin >> b;

  c = a/b;
  cout << "result is: " << c << endl;

  if (b != 0) {
    if (a > 0) {
      if (c - (int)c > 0 && c - (int)c < 1)
        cout << "fraction: " << a << "/" << b;
    } else {
      if (c - (int)c < 0 && c - (int)c < 1)
        cout << "fraction: " << a << "/" << b;
    }
  }

  return 0;
}

разделение обоих чисел с их HCF может помочь.


#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. откройте для предложений, если таковые имеются.


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

если мы разделим числа с 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

Это программа для преобразования десятичного числа в дробь

#include<iostream>
using namespace std;

int main()
{

    float num, origNum, rem = 1;
    int den = 1, i, count=0, gcd=1;

    cout << "Enter any float number to convert it into mixed fraction: ";
    cin >> origNum;

    num = origNum - static_cast<int>(origNum);

    if (num > 0.1)
    {
        while ( (rem > 0.1) )
        {
            num = num * 10;
            rem = num - static_cast<int>(num);
            count++;
        }

        for (i = 1; i <= count; i++) // counter is for the calculation of denominator part of mixed fraction 
        {
            den = den * 10;
        }

        for (i = 2; i <= num|| i<=rem; i++)
        {
            if( (static_cast<int>(num) % i == 0) && (den % i == 0) )
            {
                gcd = i;
            }   
        }

        cout << (static_cast<int>(origNum)) << " and " << (static_cast<int>(num))/gcd << "/" << den/gcd;
    }
    else
        cout << (static_cast<int>(origNum));

    return 0;   
}