Problem B: 分数类的四则运算【C++】

Description

编写分数类Fraction,实现两个分数的加、减、乘和除四则运算。主函数已给定。

Input

每行四个数,分别表示两个分数的分子和分母,以0 0 0 0 表示结束。

Output

空格分隔的两个分数的减和除的结果。

Sample Input1 2 -1 24 3 3 40 0 0 0Sample Output1 -17/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;elsereturn 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;elsecout<<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;elsereturn 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;elsecout<<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;}有山就有路,有河就能渡。

Problem B: 分数类的四则运算【C++】

相关文章:

你感兴趣的文章:

标签云: