结构体与函数的反复调用,完成分数的加减乘除。

代码以及解析如下:

#include
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

你可能感兴趣的:(结构体与函数的反复调用,完成分数的加减乘除。)