#include<iostream>
#include<string>
//分数的加减乘除
//重载元素符+ - * /
class Yls{
public:
Yls(){
fenzi=0;
fenmu=0;
};
Yls(int a,int b){
fenzi=a;
fenmu=b;
};
Yls operator+(Yls &point){
Yls yls;
yls.fenzi=fenzi+point.fenzi;
yls.fenmu=fenmu;
yls.normalize();
return yls;
}
Yls operator-(Yls &point2){
Yls yls2;
yls2.fenzi=fenzi-point2.fenzi;
yls2.fenmu=fenmu;
yls2.normalize();
return yls2;
}
Yls operator*(Yls &point){
Yls yls;
yls.fenzi=fenzi*point.fenzi;
yls.fenmu=fenmu*point.fenmu;
yls.normalize();
return yls;
}
Yls operator/(Yls &point){
Yls yls;
yls.fenzi=fenzi*point.fenmu;
yls.fenmu=fenmu*point.fenzi;
yls.normalize();
return yls;
}
int first(){
return fenzi;
}
int second(){
return fenmu;
}
private:
void normalize(){
if(fenmu<0){
fenzi*=-1;
fenmu*=-1;
}
int a=abs(fenzi),b=abs(fenmu),t;
while(b>0){
t=a%b;
a=b;
b=t;
}
fenzi/=a;
fenmu/=a;
};
int fenzi;
int fenmu;
//声明为友元函数,依次将yls类型的分子分母输到流里,返回值一般是流对象
friend std::ostream& operator<< (std::ostream& os,Yls yls){
os<<yls.fenzi<<"/"<<yls.fenmu;
return os;
};
};
int main()
{
Yls ya(1,8);
Yls yb(9,8);
Yls yc;
yc=ya+yb;
//未用重载后的<<
std::cout<<"ya="<<ya.first()<<"/"<<ya.second()<<" yb="<<yb.first()<<"/"<<yb.second()<<"\n";
std::cout<<"ya+yb=";
std::cout<<yc.first()<<"/"<<yc.second()<<"\n";
std::cout<<"ya-yb=";
std::cout<<(ya-yb).first()<<"/"<<(ya-yb).second()<<"\n";
yc=ya*yb;
std::cout<<"ya*yb=";
std::cout<<yc.first()<<"/"<<yc.second()<<"\n";
yc=ya/yb;
std::cout<<"ya/yb=";
std::cout<<yc.first()<<"/"<<yc.second()<<"\n";
//用重载后的<<可以轻松输出yls(有理数)为a/b(分数)形式
std::cout<<ya<<"\t"<<yb<<"\t"<<yc;
return 0;
}