题目链接:
分析:
本题是一道模拟题,码量大,较为繁琐,且题目只说明分子和分母全是整型范围内的整数,需要开到long long.
其中qcd表示计算分子分母的最大公约数。值得注意的是,通过观察本题结构可以发现,加减乘除四则运算在输出时,均需要将分数式化简,因此不如直接构造一个函数用来实现将分数式化至最简的功能,即turn函数。
易错点:
- 1:加减乘除运算必须在代码中通过通分来实现,(C/C++中/的结果直接保留为整数)
- 2:在turn函数中实现对a, b化简除以其最大公约数时,错误样例:
a = a / qcd(a, b);
b = b / qcd(a, b);
原因是在第一行之后a的值已经发生了变动!
正确代码:
int x = qcd(a, b);
a = a / x;
b = b / x;
以下是我的完整AC代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll qcd(ll a, ll b){
ll r;
if (b == 0) return a;
else {
r = qcd(b, a % b);
return r;
}
}
void turn(ll a, ll b){
ll x = qcd(a, b);
a = a / x;
b = b / x;
ll flag = 1;
if ((a < 0 && b > 0) || (a > 0 && b < 0)) {
cout << "(-";
flag = 0;
}
a = abs(a);
b = abs(b);
if (b == 0) {
cout << "Inf"; return ;
}
if (a == 0) {
cout << "0"; return ;
}
if (b == 1 && flag == 0) {
cout << a << ")";return ;
}
if (b == 1 && flag == 1) {
cout << a; return ;
}
else {
ll x = a / b;
if (x > 0 && flag == 1) cout << x << ' ' << a - b * x<< '/' << b;
if (x > 0 && flag == 0) cout << x << ' ' << a - b * x<< '/' << b << ')';
if (x == 0 && flag == 1) cout << a << '/' << b;
if (x == 0 && flag == 0) cout << a << '/' << b << ')';
}
}
int main()
{
ll a1, b1, a2, b2;
scanf("%lld/%lld %lld/%lld", &a1, &b1, &a2, &b2);
turn(a1, b1); cout << " + "; turn(a2, b2); cout << " = "; turn(a1 * b2 + a2 * b1, b1 * b2);puts("");
turn(a1, b1); cout << " - "; turn(a2, b2); cout << " = "; turn(a1 * b2 - a2 * b1, b1 * b2);puts("");
turn(a1, b1); cout << " * "; turn(a2, b2); cout << " = "; turn(a1 * a2, b1 * b2);puts("");
turn(a1, b1); cout << " / "; turn(a2, b2); cout << " = "; turn(a1 * b2, b1 * a2);
return 0;
}
此处附上柳神的思路和代码:
这种思路和方法更加值得参考!