题目链接 1034 有理数四则运算
本题要求编写程序,计算 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
题目解读:给定两个分数,分别输出加减乘除的结果
- 分数要化简 5/3 -----> 1 2/3 ; 4/2------->2
- 负数要加括号 (-2)
- 除数为0要输出Inf
题解
-
编写化简函数
void simplify(ll int n,ll int m){ if(n%m == 0) { //可以整除 if(n<0) cout<<"("<<n/m<<")"; else cout<<n/m; return ; } if(abs(n) > abs(m) ){//分子比分母大 ll int temp = n/m; n = n-temp*m; if(n<0) {//负数加括号 cout<<"("<<temp<<" "; simplify(abs(n),m); cout<<")"; } else{ cout<<temp<<" "; simplify(n,m); } return ; } //普通情况 ll int h = __gcd(abs(n),abs(m));//求公约数 n /= h; m /= h; if(n<0) cout<<"("<<n<<"/"<<m<<")"; else cout<<n<<"/"<<m; }
-
然后分别进行加减乘除就可以了
-
除法时进行分母是否为0的特判
-
计算过程中可能会爆int 要用long long
完整代码
#include<iostream>
#include <algorithm>
using namespace std;
#define ll long long
void simplify(ll int n,ll int m){
if(n%m == 0) { //可以整除
if(n<0) cout<<"("<<n/m<<")";
else cout<<n/m;
return ;
}
if(abs(n) > abs(m) ){//分子比分母大
ll int temp = n/m;
n = n-temp*m;
if(n<0) {//负数加括号
cout<<"("<<temp<<" ";
simplify(abs(n),m);
cout<<")";
}
else{
cout<<temp<<" ";
simplify(n,m);
}
return ;
}
//普通情况
ll int h = __gcd(abs(n),abs(m));//求公约数
n /= h;
m /= h;
if(n<0) cout<<"("<<n<<"/"<<m<<")";
else cout<<n<<"/"<<m;
}
int main()
{
ll int nums[100];//输入
scanf("%lld/%lld",&nums[0],&nums[1]);
scanf("%lld/%lld",&nums[2],&nums[3]);
ll int up=0,down=0;//分子和分母
up = nums[0]*nums[3]+nums[2]*nums[1];
down = nums[1]*nums[3];
simplify(nums[0],nums[1]);
cout<<" + ";
simplify(nums[2],nums[3]);
cout<<" = ";
simplify(up,down);
cout<<"\n";
up = nums[0]*nums[3]-nums[2]*nums[1];
down = nums[1]*nums[3];
simplify(nums[0],nums[1]);
cout<<" - ";
simplify(nums[2],nums[3]);
cout<<" = ";
simplify(up,down);
cout<<"\n";
up = nums[0]*nums[2];
down = nums[1]*nums[3];
simplify(nums[0],nums[1]);
cout<<" * ";
simplify(nums[2],nums[3]);
cout<<" = ";
simplify(up,down);
cout<<"\n";
if(nums[2] != 0) {//除法特判
up = nums[0] * nums[3];
down = nums[1] * nums[2];
if (down < 0) {
down *= -1;
up *= -1;
}
simplify(nums[0], nums[1]);
cout << " / ";
simplify(nums[2], nums[3]);
cout << " = ";
simplify(up,down);
}
else{
simplify(nums[0], nums[1]);
cout << " / ";
simplify(nums[2], nums[3]);
cout << " = ";
cout<<"Inf";
}
return 0;
}