1034 有理数四则运算
分数 20
本题要求编写程序,计算 2 个有理数的和、差、积、商。
输入格式:
输入在一行中按照 a1/b1 a2/b2 的格式给出两个分数形式的有理数,其中分子和分母全是整型范围内的整数,负号只可能出现在分子前,分母不为 0。
输出格式:
分别在 4 行中按照 有理数1 运算符 有理数2 = 结果 的格式顺序输出 2 个有理数的和、差、积、商。注意输出的每个有理数必须是该有理数的最简形式 k a/b,其中 k 是整数部分,a/b 是最简分数部分;若为负数,则须加括号;若除法分母为 0,则输出 Inf。题目保证正确的输出中没有超过整型范围的整数。
输入样例 1:
2/3 -4/2
输出样例 1:
2/3 + (-2) = (-1 1/3)
2/3 - (-2) = 2 2/3
2/3 * (-2) = (-1 1/3)
2/3 / (-2) = (-1/3)
输入样例 2:
5/3 0/6
输出样例 2:
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<cstdio>
#include<algorithm>
using namespace std;
struct Fraction{
__int64 up,down;//up,down为分子,分母
}a,b;
__int64 gcd(__int64 a,__int64 b){
if(b==0)return a;
else return gcd(b,a%b);
}
Fraction simple(Fraction result){
//分数化简有三种情况
//1.分母为负数,那么令分子分母都为相反数
//2.如果分子为0,那么令分母为1
//3.约分,分子分母同时除以最大公约数
if(result.down<0){
result.down*=-1;
result.up*=-1;
}
if(result.up==0){
result.down=1;
}
else{//分子不为0,可以进行约分
int d=gcd(abs(result.up),abs(result.down));
result.up/=d;
result.down/=d;
}
return result;
}
Fraction add(Fraction a,Fraction b){//加法
Fraction result;
result.up=a.up*b.down+a.down*b.up;
result.down=a.down*b.down;
return simple(result);//返回化简后的结果
}
Fraction jian(Fraction a,Fraction b){//减法
Fraction result;
result.up=a.up*b.down-a.down*b.up;
result.down=a.down*b.down;
return simple(result);//返回化简后的结果
}
Fraction sheng(Fraction a,Fraction b){//乘法
Fraction result;
result.up=a.up*b.up;
result.down=a.down*b.down;
return simple(result);//返回化简后的结果
}
Fraction chu(Fraction a,Fraction b){//除法
Fraction result;
result.up=a.up*b.down;//除一个数等于乘上这个数的倒数
result.down=a.down*b.up;
return simple(result);//返回化简后的结果
}
void showresult(Fraction r){
r=simple(r);
if(r.up<0)cout<<"(";//若分母小于0,则输出左括号
if(r.down==1)printf("%I64d",r.up);//分母为1,直接输出分子
else if(abs(r.up)>r.down){
printf("%I64d %I64d/%I64d",r.up/r.down,r.up%r.down,r.down);
}
else{
printf("%I64d/%I64d",r.up,r.down);
}
if(r.up<0)cout<<")";//若分母小于0,则输出右括号
}
int main(){
scanf("%I64d/%I64d %I64d/%I64d",&a.up,&a.down,&b.up,&b.down);
//加法
showresult(a);
cout<<"+";
showresult(b);
cout<<"=";
showresult(add(a,b));
cout<<endl;
//减法
showresult(a);
cout<<"-";
showresult(b);
cout<<"=";
showresult(jian(a,b));
cout<<endl;
//乘法
showresult(a);
cout<<"*";
showresult(b);
cout<<"=";
showresult(sheng(a,b));
cout<<endl;
//除法
showresult(a);
cout<<"/";
showresult(b);
cout<<"=";
if(b.up!=0) showresult(chu(a,b));
else cout<<"Inf";
cout<<endl;
}