1. 程式人生 > >第十七週oj刷題——Problem B: 分數類的四則運算【C++】

第十七週oj刷題——Problem B: 分數類的四則運算【C++】

Description

編寫分數類Fraction,實現兩個分數的加、減、乘和除四則運算。主函式已給定。

Input

每行四個數,分別表示兩個分數的分子和分母,以0 0 0 0 表示結束。

Output

空格分隔的兩個分數的減和除的結果。

Sample Input

1 2 -1 2
4 3 3 4
0 0 0 0

Sample Output

1 -1
7/12 16/9

(1)普通版。

/* All rights reserved.
 * 檔名稱:test.cpp
 * 作者:陳丹妮
 * 完成日期:2015年 7 月 2 日
 * 版 本 號:v1.0
 */
#include <iostream>
using namespace std;
class Fraction
{
private:
    int x;
    int y;
public:
    Fraction(int a=0,int b=1):x(a),y(b) {}
    friend istream& operator>>(istream& input,Fraction &f);
    bool operator ==(int a);
    void output();
    Fraction operator -(Fraction &f1);
    Fraction operator /(Fraction &f1);
};
istream& operator>>(istream& input,Fraction &f)
{
    input>>f.x>>f.y;
    return input;
}
bool Fraction::operator==(int a)
{
    if(x==a)
        return true;
    else
        return false;
}
Fraction Fraction::operator -(Fraction &f1)
{
    Fraction f;
    f.x=x*f1.y-f1.x*y;
    f.y=y*f1.y;
    return f;
}
Fraction Fraction::operator /(Fraction &f1)
{
    Fraction f;
    if(!f1.x) return *this;
    f.x=x*f1.y;
    f.y=y*f1.x;
    return f;
}
void Fraction::output()
{
    int r,m=x,n=y,t;
    if(m<n)
    {
        t=n;
        n=m;
        n=t;
    }
    while(n!=0)
    {
        r=m%n;
        m=n;
        n=r;
    }
    if(y==m)
        cout<<x/m;
    else if(x/m<0&&y/m<0)
        cout<<(-1)*x/m<<'/'<<(-1)*y/m;
    else if(y/m<0)
        cout<<-x/m<<'/'<<-y/m;
    else
        cout<<x/m<<'/'<<y/m;
}

int main()
{
    Fraction f1,f2,f3;
    while(cin>>f1>>f2)
    {
        if(f1==0&&f2==0)
            break;
        f3=f1-f2;
        f3.output();
        cout<<" ";
        f3=f1/f2;
        f3.output();
        cout<<endl;
    }
    return 0;
}

(2)函式版

#include <iostream> 
  
using namespace std; 
int gcd(int d,int n); 
class Fraction 
{ 
private: 
    double deno; //分母 
    double nume;//分子 
public: 
    Fraction(); 
    Fraction operator-(Fraction &f); 
    Fraction operator/(Fraction &f); 
    friend istream & operator>>(istream &input,Fraction &f); 
    bool  operator==(int c); 
    void output(); 
    void simplify(); 
}; 
void Fraction::output() 
{ 
    if(nume/deno==int(nume/deno)) 
     cout<<nume/deno; 
    else
    { 
       if(nume>0&&deno<0) 
      { 
          nume=-nume; 
          deno=-deno; 
       } 
       else
       { 
           nume=nume; 
           deno=deno; 
       } 
         cout<<nume<<"/"<<deno; 
    } 
  
} 
bool Fraction::operator==(int c) 
{ 
        if(nume==0&&c==0) 
             return true; 
        else return false; 
} 
  
istream & operator>>(istream &input,Fraction &f) 
{ 
    input>>f.nume>>f.deno; 
    return input; 
} 
void Fraction::simplify() 
{ 
    int n=gcd(deno, nume); 
    deno/=n;     // 化簡 
    nume/=n; 
} 
Fraction::Fraction() 
{ 
    deno=0; 
    nume=1; 
} 
Fraction Fraction:: operator-(Fraction &c) 
{ 
    Fraction t; 
    t.nume=nume*c.deno-c.nume*deno; 
    t.deno=deno*c.deno; 
    t.simplify(); 
    return t; 
} 
Fraction Fraction:: operator/(Fraction &c) 
{ 
    Fraction t; 
    if (!c.nume) return *this;   //除法無效時,這種情況需要考慮,但這種處理仍不算合理 
    t.nume=nume*c.deno; 
    t.deno=deno*c.nume; 
    t.simplify(); 
    return t; 
} 
int gcd(int m, int n) //這個函式可以定義為類的成員函式,也可以為一般函式 
{ 
    int r; 
    if (m==0) 
    { 
        return n; 
    } 
    while(r=m%n)  // 求m,n的最大公約數 
    { 
        m=n; 
        n=r; 
    } 
    return n; 
} 
int main() 
  
{ 
  
   Fraction f1,f2,f3; 
  
   while(cin>>f1>>f2) { 
  
      if(f1==0&&f2==0) 
  
        break; 
  
      f3=f1-f2; 
  
      f3.output(); 
      cout<<' '; 
      f3=f1/f2; 
  
      f3.output(); 
  
      cout<<endl; 
  
   } 
  
   return 0; 
  
} 
/* All rights reserved.
 * 檔名稱:test.cpp
 * 作者:陳丹妮
 * 完成日期:2015年 7 月 2 日
 * 版 本 號:v1.0
 */
#include <iostream>
using namespace std;
class Fraction
{
private:
    int x;
    int y;
    int e;
public:
    Fraction(int a=0,int b=1):x(a),y(b)
    {
        e=0;
    }
    friend istream& operator>>(istream& input,Fraction &f);
    bool operator ==(int a);
    void output();
    Fraction operator -(Fraction &f1);
    Fraction operator /(Fraction &f1);
};
istream& operator>>(istream& input,Fraction &f)
{
    input>>f.x>>f.y;
    return input;
}
bool Fraction::operator==(int a)
{
    if(x==a)
        return true;
    else
        return false;
}
Fraction Fraction::operator -(Fraction &f1)
{
    Fraction f;
    f.x=x*f1.y-f1.x*y;
    f.y=y*f1.y;

    return f;

}
Fraction Fraction::operator /(Fraction &f1)
{
    Fraction f;
    if (!f1.x) return *this;
    f.x=x*f1.y;
    f.y=y*f1.x;
    return f;
}
void Fraction::output()
{
    int r,m=x,n=y,t;
    if(m<n)
    {
        t=n;
        n=m;
        n=t;
    }
    while(n!=0)
    {
        r=m%n;
        m=n;
        n=r;
    }
    if(y==m)
        cout<<x/m;
    else if(x/m<0&&y/m<0)
        cout<<-x/m<<'/'<<-y/m;
    else if(y/m<0)
        cout<<-x/m<<'/'<<-y/m;
    else
        cout<<x/m<<'/'<<y/m;
    if(e==0)
        cout<<" ";
    e++;
}

int main()
{
    Fraction f1,f2,f3;
    while(cin>>f1>>f2)
    {
        if(f1==0&&f2==0)
            break;
        f3=f1-f2;
        f3.output();
        f3=f1/f2;
        f3.output();
        cout<<endl;
    }
    return 0;
}


學習心得:這道題提交了很多次,原來就是因為沒有考慮分子為0的情況,導致錯誤,前兩個都AC對了,最後一個沒有AC但是,編譯時都是對的,就是不知道格式是哪裡出錯了。希望有人能幫我指出來,謝謝,繼續努力吧!!!