如何实现最大公约数以简化分数

How to implement greatest common divisor to simplify fractions

本文关键字:最大公约数 何实现 实现      更新时间:2023-10-16
#include <iostream>
using namespace std;
int g_c_d(int n, int d);
class Fraction
{
private:
  //variables to store numerator and denominator
  int num;
  int denom;
public:
  Fraction(){}
  Fraction(int num): num(num) {}
  Fraction(int num, int denom): num(num), denom(denom) {}
  void set_num(int n){ num = n;}
  void set_denom(int d){ denom = d;}
  int get_numerator() const {return num;}
  int get_denominator() const {return denom;}
};
  int g_c_d(int n, int d){
    return d == 0? n : g_c_d(d, n % d);
 }
istream &operator>> (istream &input, Fraction &f)
{
  int n, d;
  char slash;
  input >> n;
  input >> slash;
  input >> d;
  if (d == 0) {n = 0;} //if denom is 0; fraction = 0/0
  f = Fraction(n, d);
  return input;
}
ostream &operator<<(ostream &output, const Fraction &frac)
{
  return output << frac.get_numerator() << "/" << frac.get_denominator();
}

int main()
{
   int n, d;
   Fraction frac;
   int gcd;
   n = frac.get_numerator();
   d = frac.get_denominator();
   gcd = g_c_d(frac.get_numerator() , frac.get_denominator());
   cout << "Enter a fraction" << endl;
   cin >> frac;
   frac.set_num(n/gcd);
   frac.set_denom(d/gcd);
   cout << "your fraction is: ";
   cout << frac << endl;
   return 0;
}

嗨,我试图简化用户输入的分数。但是,每次我输入要简化的分数时,返回的输出都是"1/0"。

有人可以帮忙吗,将不胜感激!

问题是,在要求用户输入分数之前,你对frac进行了所有计算,然后你覆盖了用户输入的任何内容。您需要移动此位:

   cout << "Enter a fraction" << endl;
   cin >> frac;

要高得多。

当您设置代码时,您拥有:

Fraction frac;

这将调用 Fraction 的默认构造函数。由于您从未初始化过构造函数中的成员,因此您将获得 int 类型的默认初始化,即 0。然后:

n = frac.get_numerator();
d = frac.get_denominator();

这使得nd为 0。从那时起,您将使用nd的值。但是,这些值不是用户输入frac的值,而只是您从默认值中获得的值。在执行任何计算之前,将代码更改为读取用户输入的frac值。

这里要学习的主要教训是确保不使用未初始化的变量。一般来说,当您在启用所有警告的情况下进行编译时,这是编译器会警告的事情。

您可能跳水为零,因为默认构造函数不会为分母赋值。 在分母设置为零的情况下,gcd() 函数将在 main 中第一次除以零。