如何输出分数而不是十进制数?

时间:2011-01-27 16:35:19

标签: c++ fractions

在C ++中,当我计算2/3时,它会输出十进制值,我怎样才能得到原始格式(即2/3)而不是0.66666667

由于

13 个答案:

答案 0 :(得分:10)

你做不到。你需要写一个专门用于保持有理数(即分数)的类。或者只是使用Boost Rational Number library

答案 1 :(得分:8)

如果我理解正确,您有一个浮点数(floatdouble类型变量),并且您希望将此值作为分数输出。

如果是这种情况,您需要进一步指明您的问题:

  • 根据定义,FP编号 是一个分数:FP编号由两个整数组成,尾数 m 和指数 e (和一个标志,但这在这里无关紧要)。所以每个FP编号实际上是一对(m,e),它所代表的值 f f = mb ^ e (其中< em> b 是一个固定的积分基,通常是2)。因此,作为分数的自然表示只是 m / b ^( - e),其中 e&lt; 0 (如果 e&gt; = 0 ,< em> f 无论如何都是不可或缺的。)
  • 但是,您可能希望得到具有最小合理除数的分数。这是一个不同的问题。要获得是,你可以例如使用Pari / GP库中的bestappr功能。在您的情况下,您可能使用bestappr(x, A),输入 x A 是您想要尝试的最大分母。 bestappr会给你最接近 x 的分数,其分母仍然小于 A

答案 2 :(得分:6)

编写自己的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();

答案 3 :(得分:4)

  

我怎样才能获得原始格式   (即2/3)代替0.66666667

通过使用自定义输出运算符包装类似GMP库的内容,非常困难。以下是关于GMP的更多内容:

  

什么是GMP?

     

GMP是一个免费的库   任意精度算术,   按照有符号整数运算,理性   数字和浮点数。   没有实际限制   除了隐含的精度之外的精度   机器中的可用内存   GMP继续运行。 GMP有一套丰富的   功能,功能有   常规界面。

     

GMP的主要目标应用   密码学应用程序和   研究,互联网安全   应用程序,代数系统,   计算代数研究等。

     

GMP经过精心设计   尽可能快,两者都很小   操作数和巨大的操作数。该   通过使用全字来实现速度   作为基本算术类型,通过使用   快速算法,高度优化   汇编代码最常见   很多CPU的内部循环,以及   一般强调速度。

     

GMP比任何其他bignum都快   图书馆。 GMP的优势   随着操作数大小的增加而增加   自GMP使用以来的许多操作   渐近更快的算法。

     

首次发布GMP版本   1991年,它不断发展和维护,有一个新版本   一年一次。

答案 4 :(得分:4)

你必须将它们存储在某种带有两个整数字段的Fraction类中。当然,在将其用于输出之前,您必须简化分数。

您可以开发自己的类或使用一些库,例如这个库用于精确数学:CLN - Class Library for Numbers

答案 5 :(得分:3)

这通常是不可能的:浮点数不精确,并且没有足够的信息来完全重建分数。

然而,您可以编写一个启发式找到“最佳”近似值的函数,其中优先选择具有小分子和分母的分数,以及与浮点数具有几乎相同值的分数。

如果您完全掌控代码,Oli的想法更好:不要丢弃信息。

答案 6 :(得分:2)

您可以将所有分数分子和分母存储为整数。整数具有二进制的精确表示。

答案 7 :(得分:2)

为了简化工作,我建议你尽可能坚持已知的分母。

我正在使用一个应用程序,其中分数被限制为2的幂或3(对于三分之一)的分母。

我使用近似值(舍入到最接近的1.0 / 24.0)转换为这些分数。

没有一些限制,找到分母可能是一项繁琐的工作,并占用了大量的执行时间。

答案 8 :(得分: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;
}

答案 9 :(得分:0)

将这两个数字与他们的HCF分开可能有所帮助。

答案 10 :(得分:0)

#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得到余数。 如果有任何建议,请打开。

答案 11 :(得分:0)

使用最大公约数概念。

如果我们将数字除以数字的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

答案 12 :(得分:-1)

这是一个将十进制数转换为分数

的程序
#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;   
}