Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何输出分数而不是十进制数? 在C++中,当我计算2/3时,它将输出十进制值,我如何才能得到原始格式(即G 2/3)而不是0×6666666 7 < /p>_C++_Fractions - Fatal编程技术网

如何输出分数而不是十进制数? 在C++中,当我计算2/3时,它将输出十进制值,我如何才能得到原始格式(即G 2/3)而不是0×6666666 7 < /p>

如何输出分数而不是十进制数? 在C++中,当我计算2/3时,它将输出十进制值,我如何才能得到原始格式(即G 2/3)而不是0×6666666 7 < /p>,c++,fractions,C++,Fractions,多亏了这在一般情况下是不可能的:浮点数不精确,不能保留足够的信息来完全重构分数 但是,您可以编写一个函数,以启发式方式找到“最佳”近似值,其中分子和分母较小的分数是首选的,与浮点值几乎相同的分数也是首选的 如果你能完全控制代码,Oli的想法会更好:首先不要丢弃信息。你不能。您需要编写一个专门用于保存有理数(即分数)的类。或者干脆用这个 我怎样才能得到原始格式 (例如2/3)而不是0.6667 只有通过使用自定义输出操作符包装库之类的东西,才能非常困难地完成这项工作。以下是关于GMP的更多信息:

多亏了

这在一般情况下是不可能的:浮点数不精确,不能保留足够的信息来完全重构分数

但是,您可以编写一个函数,以启发式方式找到“最佳”近似值,其中分子和分母较小的分数是首选的,与浮点值几乎相同的分数也是首选的


如果你能完全控制代码,Oli的想法会更好:首先不要丢弃信息。

你不能。您需要编写一个专门用于保存有理数(即分数)的类。或者干脆用这个

我怎样才能得到原始格式 (例如2/3)而不是0.6667

只有通过使用自定义输出操作符包装库之类的东西,才能非常困难地完成这项工作。以下是关于GMP的更多信息:

什么是GMP? GMP是一个免费的图书馆 任意精度算法, 对有符号整数进行运算,有理数 数字和浮点数。 这个问题没有实际的限制 精确性,除了 机器中的可用内存 GMP继续运行。GMP有一套丰富的 函数,并且函数具有 常规接口

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

GMP经过精心设计,可作为 速度越快越好,都是小的 操作数和,用于大型操作数。这个 速度是通过使用fullwords来实现的 作为基本算术类型,使用 快速算法,高度优化 最常用的汇编代码 许多CPU的内部循环,以及 对速度的普遍强调

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

第一次GMP发布于年 1991它是不断开发和维护的,有一个关于 一年一次


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

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


您可以开发自己的类或使用一些库,例如用于精确数学的库:

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

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

  • 根据定义,FP数是一个分数:一个FP数由两个整数组成,一个尾数m和一个指数e(还有一个符号,但这与此无关)。所以每个FP数实际上是一对(m,e),它表示的值f是f=mb^e(其中b是一个固定的整数基,通常为2)。所以分数的自然表示形式是简单的m/b^(-e),e=0,f是积分)
  • 但是,您可能希望得到具有最小合理除数的分数。这是另一个问题。要获取is,例如,您可以使用Pari/GP库中的函数。在您的情况下,您可能会使用
    bestappr(x,A)
    ,输入x,A是您想要尝试的最大分母。bestappr将给出最接近x的分数,其分母仍然小于A

    • 编写您自己的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;
          }
      };
      
      class理性
      {
      公众:
      整数分子、分母;
      Rational(int num,int den=1){
      分子=num;
      分母=den;
      }
      理性的(理性的其他){
      分子=其他。分子;
      分母=其他。分母;
      }
      双运算符/(整数除数){
      分母*=除数;
      简化();
      返回getrealformat();
      }
      有理算子/(整数除数){
      分母*=除数;
      简化();
      归还这个;
      }
      有理数与运算符/(有理数与除数){
      分子*=除数。分子;
      分母*=除数。分母;
      简化();
      归还这个;
      }
      双运算符/(整数除数){
      分母*=除数;
      简化();
      返回getrealformat();
      }
      双getrealformat(){
      返回分子/分母;
      }
      简化{
      int公约数=1;
      
      对于(inti=2;i,为了简化工作,我建议您尽可能使用已知分母

      我正在处理一个应用程序,其中分数限制为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;
      }
      
      #包括
      使用名称空间std;
      int main()
      {
      双a;
      双b;
      双c;
      cout>a;
      cout>b;
      c=a/b;
      
      cout用HCF将两个数字分开可能会有所帮助。

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

      #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;   
      }
      
      #包括
      使用名称空间std;
      int main()
      {
      浮点数,原点,rem=1;
      int den=1,i,count=0,gcd=1;
      原发灶;
      num=origNum-静态施法(origNum);
      如果(数值>0.1)
      {
      而((雷姆>0.1))
      {
      num=num*10;
      rem=num-静态施法(num);
      计数++;
      }
      对于(i=1;i
      #包括
      使用名称空间std;
      
      #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;   
      }
      
      #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;
      }
      
      #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