1034 有理数四则运算(模板)

没做出来,看dalao的,dalao超巨。
注意的点: 分子0的处理/计算公约数的时候取正不然会改变正负性
reduction为核心方法

#include <bits/stdc++.h>
using namespace std;
#define ll long long
struct Fraction{
	ll fenzi,fenmu;
};
int gcd(int a,int b){
	if(b==0) return a;
	return gcd(b,a%b);
} 
int lcm(int a,int b){
	return a/gcd(a,b)*b;
}
//化简
Fraction reduction(Fraction a){//来到这个函数的时候a的分子分母正负都是随意的 
	if(a.fenmu < 0){
		a.fenzi = -a.fenzi;
		a.fenmu = -a.fenmu;
	}
	if(a.fenzi == 0) a.fenmu = 1;
	else{
		ll gy = abs(gcd(a.fenzi,a.fenmu));//取正 才不会改变分子分母的符号 
		a.fenmu /= gy;
		a.fenzi /= gy;
	}
	return a;
} 
//加法
Fraction add(Fraction &a,Fraction &b){
	Fraction c;
	c.fenzi = a.fenzi*b.fenmu + a.fenmu*b.fenzi;
	c.fenmu = a.fenmu*b.fenmu;
	return reduction(c);
}
//减法
Fraction sub(Fraction &a,Fraction &b){
	Fraction c;
	c.fenzi = a.fenzi*b.fenmu - a.fenmu*b.fenzi;
	c.fenmu = a.fenmu*b.fenmu;
	return reduction(c);
}
//乘法 
Fraction muti(Fraction &a,Fraction &b){
	Fraction c;
	c.fenzi = a.fenzi * b.fenzi;
	c.fenmu = a.fenmu * b.fenmu;
	return reduction(c);
}
//除法 
Fraction divide(Fraction &a,Fraction &b){
	Fraction c;
	c.fenzi = a.fenzi * b.fenmu;
	c.fenmu = b.fenzi * a.fenmu;
	return reduction(c);
}
//打印结果
void print(Fraction a){//来到这里的时候是最简式分子为正/负  分母为正  可能是假分式/真分式 
	if(a.fenzi < 0) printf("(");//负数加括号 
	if(a.fenmu == 1) printf("%lld",a.fenzi);//如果是整数 只打印分子
	else if(abs(a.fenzi) > abs(a.fenmu)) printf("%lld %lld/%lld",a.fenzi/a.fenmu,abs(a.fenzi)%a.fenmu,a.fenmu);//如果是假分式
    else printf("%lld/%lld",a.fenzi,a.fenmu);
	if(a.fenzi < 0) printf(")");//负数加括号 
} 
int main(){
    Fraction a,b;
    scanf("%lld/%lld %lld/%lld",&a.fenzi,&a.fenmu,&b.fenzi,&b.fenmu);
    //将a化简
    a=reduction(a);
    b=reduction(b);
    //加法
	print(a);
	printf(" + ");
	print(b);
	printf(" = ");
	print(add(a,b));
	printf("\n");
	//减法 
	print(a);
	printf(" - ");
	print(b);
	printf(" = ");
	print(sub(a,b));
	printf("\n");
	//乘法
	print(a);
	printf(" * ");
	print(b);
	printf(" = ");
	print(muti(a,b));
	printf("\n");
	//除法
	print(a);
	printf(" / ");
	print(b);
	printf(" = ");
	if(b.fenzi == 0) printf("Inf");
	else print(divide(a,b));
	printf("\n"); 
	return 0;
}
posted @ 2024-04-17 17:04  YuKiCheng  阅读(7)  评论(0编辑  收藏  举报