如何输出部分,而不是十进制数?如何输出部分,而不是十进制数?(How to output fract

2019-05-12 05:57发布

在C ++中,当我计算2/3,它将输出十进制值,我怎么能刚刚得到的原始格式(IEG 2/3),而不是0.66666667

谢谢

Answer 1:

你不能。 您需要编写一个专用于保存有理数(即分数)类。 或者只是使用升压有理数库 。



Answer 2:

如果我理解正确的话,你有一个浮点数(一个floatdouble类型的变量),以及你想输出该值作为一小部分。

如果是这样的话,则需要进一步的叙述你的问题:

  • 甲FP数目一小部分,由定义:FP号由两个整数,尾数m和一个expontent 电子商务 (和符号,但是这无关紧要这里)。 因此,每个FP数目确实是一个对(M,E),以及值f它代表为:F = mb个^ E(其中,b是固定积分的基础上,通常为2)。 因此,自然表现为分数仅仅是M / B ^( - E)e <0(如果E> = 0,f是整体的反正)。
  • 不过,你可能想用最小除数合理的分数。 这是一个不同的问题。 要得到的是,你可以如使用bestappr函数从帕里/ GP库。 在你的情况,你可能会使用bestappr(x, A)其中x你的投入,你想尝试的最大分母。 bestappr会给你的分数最接近x分母仍然是小于A。


Answer 3:

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


Answer 4:

我怎么能刚刚得到的原始格式(IEG 2/3),而不是0.66666667

只有通过包装类似的大困难GMP库自定义输出的运营商。 下面是多一点的GMP:

什么是GMP?

GMP是高精度计算一个免费的图书馆,上有符号整数,有理数操作,和浮点数。 没有实际的限制除非在机器的可用内存GMP运行于隐含的那些精度。 GMP具有丰富的功能集和功能有一个普通接口。

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

GMP是经过精心设计成尽可能快,无论是小的操作数和巨大的操作数。 速度是通过使用fullwords为基本算术类型来实现,通过使用快速算法,以用于大量CPU的最常见的内环高度优化汇编代码,并通过一般的强调速度。

GMP是比任何其他BIGNUM库更快。 对GMP的优点与操作数大小的许多操作会增加,因为GMP采用渐进更快的算法。

第一个GMP释放在1991年使其不断开发和维护,用新的版本大约一年一次。



Answer 5:

你必须把它们存储在某种Fraction类的有两个整数字段。 当然,你必须使用它的输出之前,以简化的分数。

你可以开发自己的类或使用一些图书馆,像这样一个精确的数学: CLN -类库号



Answer 6:

这是一般不可能:浮点数并不精确,不保留足够的信息来完全重构的一小部分。

你可以,但是,写启发式找到“最佳”近似,由此与小分子和分母的馏分被优选的,因为是具有几乎相同的值作为浮点数馏分的函数。

如果您在代码的完全控制的时候,奥利奇的想法是更好的:不要扔掉摆在首位的信息。



Answer 7:

您可以将所有分数的分子和分母为intergers。 整型数据的二进制精确表示。



Answer 8:

为了简化工作,我建议你坚持使用已知的分母如果可能的话。

我正在与其中的级分被限制为2的幂的分母的应用加工,或利用3(用于三分之二)。

余转换为使用近似(四舍五入到最接近的1.0 / 24.0)这些级分。

如果没有一定的限制,寻找分母可以是一个相当繁琐且占用大量的执行时间。



Answer 9:

我是初学者,这样一来,我使用可能不是一个正确的方法

#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;
}


Answer 10:

除以他们引以为豪的这两个数字可能会有所帮助。



Answer 11:

#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则获得了由水性* B的余数。 打开如有suggetions。



Answer 12:

使用最大公约数的概念。

如果我们与他们的数量的GCD划分的数字,我们得到those.example的最小可能值: -

#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


Answer 13:

这是一个十进制数转换成分数的程序

#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;   
}


文章来源: How to output fraction instead of decimal number?
标签: c++ fractions