知识点只有求最大公约数,可以辗转相除法、更相减损法、Stein算法
更重要的是细节问题,测试点四是负整数,举例水平还有待提高。。。
#include <iostream>
#include<cmath>
using namespace std;
long long n[101], m[101], x, y, k, b;
long long p = 0;
char a;
long long def(long long c, long long d)
{
if (c == d)
return c;
return c > d ? def(c - d, d) : def(c, d - c);
}
int main() {
cin >> k;
x = 1;
y = 0;
for (int i = 0; i < k; i++)
{
cin >> n[i] >> a >> m[i];
if (n[i] == 0)
b = m[i];
else
b = def(abs(n[i]), m[i]);
n[i] = n[i] / b;
m[i] = m[i] / b;
x = x * m[i];
}
for (int i = 0; i < k; i++)
{
n[i] = n[i] * (x / m[i]);
y = y + n[i];
}
if (y == 0)
cout << 0;
else
{
if (y > 0)
b = def(y, x);
else
b = def(-y, x);
y = y / b;
x = x / b;
if (abs(y) < x)
cout << y << "/" << x;
else
{
while (abs(y) > x)
{
if (y < 0)
y = y + x;
else
y = y - x;
p++;
}
if (x == y)
cout << p + 1;
else if (x == -y)
cout << -p - 1;
else
cout << p << " " << y << "/" << x;
}
}
return 0;
}