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



  • 相关阅读:
    梦断代码阅读笔记03
    第十二周进度条
    找“水王”
    梦断代码阅读笔记02
    梦断代码阅读笔记01
    团队开发第二阶段个人博客(2)
    团队开发第二阶段个人博客(1)
    个人总结
    第16周学习进度条
    个人进度条第15周
  • 原文地址:https://www.cnblogs.com/blfshiye/p/5149613.html
Copyright © 2011-2022 走看看