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