代码以及解析如下:
#include<bits/stdc++.h>
using namespace std;
struct fraction {//分数
int up,down;//分子,分母
};
int gcd(int x,int y) {
// while(y^=x^=y^=x%=y);
// return x;
return y?gcd(y,x%y):x;
}
fraction reduction(fraction result) {
if(result.down<0) {
result.up=-result.up;
result.down=-result.down;
}
if(result.up==0) result.down=1;//如果分子为0,令分母为 1
else {
int d=gcd(abs(result.up),abs(result.down));//分子分母的最大公约数
result.up/=d;//约去最大公约数
result.down/=d;
}
return result;
}
fraction add(fraction f1,fraction f2) {//分数f1加上分数f2
fraction result;
result.up=f1.up*f2.down+f2.up*f1.down;//分子和的分子
result.down=f1.down*f2.down;//分数和的分母
return reduction(result);//返回结果分数,注意化简
}
fraction minu(fraction f1,fraction f2) {//分数f1减去分数f2
fraction result;
result.up=f1.up*f2.down-f2.up*f1.down;//分数差的分子
result.down=f1.down*f2.down;//分数差的分母
return reduction(result);//返回结果分数,注意化简
}
fraction multi(fraction f1,fraction f2) {// 分数f1乘以分数f2
fraction result;
result.up=f1.up*f2.up;//分数积的分子
result.down=f1.down*f2.down;//分数积的分母
return reduction(result);//返回结果分数,注意化简
}
fraction divide(fraction f1,fraction f2) {//分数f1除以分数f2
fraction result;
result.up=f1.up*f2.down;//分数商的分子
result.down=f1.down*f2.up;//分数商的分母
return reduction(result);//返回结果分数, 注意化简
}
void showresult(fraction r) {//输出分数r
r=reduction(r);
if(r.down==1) cout<<r.up;//整数
else if(abs(r.up)>r.down) {//假分数
cout<<r.up/r.down<<" "<<abs(r.up)%r.down<<"/"<<r.down;
} else cout<<r.up<<"/"<<r.down<<endl;//真分数
}
int main() {
fraction x,y;
cin>>x.up>>x.down>>y.up>>y.down;
int z;
cout<<"相加:1,相减:2,相乘:3,相除:4"<<endl;
cin>>z;
if(z==1) showresult(add(x,y));
if(z==2) showresult(minu(x,y));
if(z==3) showresult(multi(x,y));
if(z==4) showresult(divide(x,y));
return 0;
}
特别提醒:
在进行乘除运算时,用可能会超出int的范围,可以改数据类型为long long