第十七周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可是,编译时都是对的,就是不知道格式是哪里出错了。希望有人能帮我指出来,谢谢,继续努力吧!!



posted @ 2016-01-21 21:12  blfshiye  阅读(301)  评论(0编辑  收藏  举报