PAT(B)有理数四则运算(20)

题目链接:https://www.nowcoder.com/pat/6/problem/4060

题目描述

本题要求编写程序,计算2个有理数的和、差、积、商。

输入描述:

输入在一行中按照“a1/b1 a2/b2”的格式给出两个分数形式的有理数,其中分子和分母全是整型范围内的整数,负号只可能出现在分子前,分

母不为0。

输出描述:

分别在4行中按照“有理数1 运算符 有理数2 = 结果”的格式顺序输出2个有理数的和、差、积、商。注意输出的每个有理数必须是该有理数的

最简形式“k a/b”,其中k是整数部分,a/b是最简分数部分;若为负数,则须加括号;若除法分母为0,则输出“Inf”。题目保证正确的输出中

没有超过整型范围的整数。

输入例子:

5/3 0/6

输出例子:

1 2/3 + 0 = 1 2/3

1 2/3 - 0 = 1 2/3

1 2/3 * 0 = 0

1 2/3 / 0 = Inf
#include<iostream>
#include<cmath>
using namespace std;
typedef long long ll;
int gcd(ll a,ll b){
	if(a%b==0){
		return b;
	}
	return gcd(b,a%b);
}
void output(ll a,ll b){
	//带分数前面的整数部分,初始化为0. 
	ll c=0;
	//正数 
	if(a>0){
		//如3/1 
		if(b==1){
			cout<<a; 
		}
		//如5/3
		else if(a>b){
			c=a/b;
			a-=b*c;
			cout<<c<<" "<<a<<"/"<<b;
			
		} 
		//如3/5
		else{
			cout<<a<<"/"<<b;
		} 
	}
	//a==0如0/3
	else if(a==0){
		cout<<"0";
	} 
	//a<0
	else{
		//如-3/1 
		if(b==1){
			cout<<"("<<a<<")"; 
		}
		//如-5/3
		else if(abs(a)>b){
			c=a/b;
			a=-1*a%b;
			cout<<"("<<c<<" "<<a<<"/"<<b<<")";
		}
		//如-3/5
		else{
			cout<<"("<<a<<"/"<<b<<")";
		}
	}
}
void add(ll a1,ll b1,ll a2,ll b2){
	output(a1,b1);
	cout<<" + ";
	output(a2,b2);
	cout<<" = ";
	ll a3=a1*b2+a2*b1;
    ll b3=b1*b2;
    //化简到最简形式,非带分数形式
    ll gcd3=abs(gcd(a3, b3));
    a3/=gcd3;
    b3/=gcd3;
    output(a3,b3);
    cout<<endl; 
}

void sub(ll a1, ll b1, ll a2, ll b2){
    output(a1,b1);
    cout<<" - ";
    output(a2,b2);
    cout<<" = ";
    ll a3=a1*b2-a2*b1;
    ll b3=b1*b2;
    //化简到最简形式,非带分数形式
    ll gcd3=abs(gcd(a3, b3));
    a3/=gcd3;
    b3/=gcd3;
    output(a3,b3);
    cout<<endl; 
}

void mul(ll a1, ll b1, ll a2, ll b2){
    output(a1, b1);
    cout<<" * ";
    output(a2, b2);
    cout<<" = ";
    ll a3=a1*a2;
    ll b3=b1*b2;
    //化简到最简形式,非带分数形式
    ll gcd3=abs(gcd(a3, b3));
    a3/=gcd3;
    b3/=gcd3;
    output(a3,b3);
    cout<<endl; 
}

void div(ll a1, ll b1, ll a2, ll b2){
    output(a1,b1);
    cout<<" / ";
    output(a2,b2);
    cout<<" = ";
    if(a2==0){
        cout<<"Inf";
    }
    else if(a2 < 0){
        ll a3=-1*a1*b2;
        ll b3=-1*b1*a2;
        //化简到最简形式,非带分数形式
        ll gcd3=abs(gcd(a3, b3));
        a3/=gcd3;
        b3/=gcd3;
        output(a3,b3);
    }
    else{
        ll a3=a1*b2;
        ll b3=b1*a2;
        //化简到最简形式,非带分数形式
        ll gcd3=abs(gcd(a3, b3));
        a3/=gcd3;
        b3/=gcd3;
        output(a3,b3);
    }
    cout<<endl; 
}

int main(){
	ll a1,b1,a2,b2;
	ll c1=0;
	ll c2=0;
	scanf("%lld/%lld %lld/%lld",&a1,&b1,&a2,&b2);
	//先化简到最简形式 
	ll gcd1=abs(gcd(a1,b1));
	a1/=gcd1;
	b1/=gcd1;
	ll gcd2=abs(gcd(a2,b2));
	a2/=gcd2;
	b2/=gcd2;
	
	//统一最简形式运算
	add(a1,b1,a2,b2);
	sub(a1,b1,a2,b2);
	mul(a1,b1,a2,b2); 
	div(a1,b1,a2,b2);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/m0_37345402/article/details/81591418