题目链接: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;
}