本题要求编写程序,计算 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<stdio.h>
#include<algorithm>
using namespace std;
typedef long long ll;
ll gcd(ll a, ll b) { //求a,b最大公约数
if(b == 0) {
return a;
} else {
return gcd(b, a % b);
}
}
struct Fraction { //分数
ll up; //分子
ll down; //分母
}a, b;
Fraction reduction(Fraction result) {
if(result.down < 0) {
//统一将分数的符号放在分子
result.up = -result.up;
result.down = -result.down;
}
if(result.up == 0) { //若分子为0 ,即该有理数为0,那么整数的分母是“1”,而0需要特判
result.down = 1; //则分母令为1;
} else { //进行约分
int d = gcd(abs(result.up), abs(result.down)); //找出分子分母绝对值的最大公约数
result.up /= d;
result.down /= d;
}
return result;
}
Fraction add(Fraction f1, Fraction f2) { //分数加法
Fraction result;
//加法也要通分啊,亲爱的
result.up = f1.up * f2.down + f2.up * f1.down;
result.down = f1.down * f2.down;
/*result.up = f1.up + f2.up; //分子进行加和
result.down = f1.down + f2.down; //分母进行加和 */
return reduction(result); //约分
}
Fraction minu(Fraction f1, Fraction f2) { //分数减法
Fraction result;
result.up = f1.up * f2.down - f2.up * f1.down;
result.down = f1.down * f2.down;
//要通分啊,亲爱的
/*result.up = f1.up - f2.up; //分子相减
result.down = f1.down - f2.down; //分母相减 */
return reduction(result); //约分
}
Fraction multi(Fraction f1, Fraction f2) {
Fraction result;
result.up = f1.up * f2.up;
result.down = f1.down * f2.down;
return reduction(result);
}
Fraction divide(Fraction f1, Fraction f2) {
//除法是乘以倒数
Fraction result;
result.up = f1.up * f2.down;
result.down = f1.down * f2.up;
return reduction(result);
}
void showRusult(Fraction r) {
r = reduction(r); //约分化简
if(r.up < 0) { //负数要加括号
printf("(");
}
if(r.down == 1) { //该有理数为整数
printf("%lld", r.up);
} else if (abs(r.up) > abs(r.down)){ //假分数,已经没有公约数,进一步化成带分数
printf("%lld %lld/%lld", r.up / r.down, abs(r.up) % r.down, r.down);
} else {
printf("%lld/%lld", r.up, r.down);
}
if(r.up < 0) { //补上另一半括号
printf(")");
}
}
int main() {
scanf("%lld/%lld %lld/%lld", &a.up, &a.down, &b.up, &b.down);
//加法
showRusult(a);
printf(" + ");
showRusult(b);
printf(" = ");
showRusult(add(a, b));
printf("\n");
//减法
showRusult(a);
printf(" - ");
showRusult(b);
printf(" = ");
showRusult(minu(a, b));
printf("\n");
//乘法
showRusult(a);
printf(" * ");
showRusult(b);
printf(" = ");
showRusult(multi(a, b));
printf("\n");
//除法
showRusult(a);
printf(" / ");
showRusult(b);
printf(" = ");
if(b.up == 0) {
printf("Inf");
} else {
showRusult(divide(a, b));
}
return 0;
} ```