题目网址
https://pintia.cn/problem-sets/994805260223102976/problems/994805287624491008
思路
注意两个点,一是辗转相除法递归会超时,二是int范围会爆,得用long,不然测试点2、3过不去。思路就是模拟。
代码
#include<iostream>
#include<cmath>
using namespace std;
long gcd(long a, long b)
{
if (a < b)
swap(a, b);
// return b == 0 ? a : gcd(b, a % b);
while(b > 0) {
int t = a % b;
a = b;
b = t;
}
return a;
}
void fun(long a, long b){//化简
if (a == 0) {
cout << 0;
return ;
}
long t = gcd(abs(a), abs(b));//最大公因数
long T = abs(a * b) / t;//最小公倍数
a /= t;
b /= t;
if (a < 0) {
cout << "(-";
a = -a;
if ((a % b) == 0)
cout << a / b;
else {
if (a / b > 0)
cout << a / b << " ";
cout << a % b << "/" << b;
}
cout << ")";
}
else if (a == 0)
cout << 0;
else {
if ((a % b) == 0)
cout << a / b;
else {
if (a / b > 0)
cout << a / b << " ";
cout << a % b << "/" << b;
}
}
}
int main() {
long a1;
long a2;
long b1;
long b2;
long A;
long B;
scanf("%ld/%ld %ld/%ld", &a1, &a2, &b1, &b2);
//加法
fun(a1, a2);
cout << " + ";
fun(b1, b2);
cout << " = ";
A = a1 * b2 + b1 * a2;
B = a2 * b2;
if (B < 0) {
A = -A;
B = -B;
}
fun(A, B);
cout << endl;
//减法
fun(a1, a2);
cout << " - ";
fun(b1, b2);
cout << " = ";
A = a1 * b2 - b1 * a2;
B = a2 * b2;
if (B < 0) {
A = -A;
B = -B;
}
fun(A, B);
cout << endl;
//乘法
fun(a1, a2);
cout << " * ";
fun(b1, b2);
cout << " = ";
A = a1 * b1;
B = a2 * b2;
if (B < 0) {
A = -A;
B = -B;
}
fun(A, B);
cout << endl;
//除法
fun(a1, a2);
cout << " / ";
fun(b1, b2);
cout << " = ";
A = a1 * b2;
B = a2 * b1;
if (B < 0) {
A = -A;
B = -B;
}
if (B == 0) {
cout << "Inf" << endl;
return 0;
}
fun(A, B);
cout << endl;
return 0;
}