题目链接https://pintia.cn/problem-sets/994805342720868352/problems/994805386161274880
简单题,好像在乙级也见过。最重要的两个点是求最大公约数和最小公倍数。
求最大公约数,用经典GCD
long int mygcd(long int a, long int b) {
long int temp = a;
while (a % b != 0) {
a = b;
b = temp % b;
temp = a;
}
return b;
}
求最小公倍数:a*b/gcd(a*b)
即可
算完后再分子分母简化一遍,输出时注意特殊情况
long int g = mygcd(sum.a, sum.b);
sum.a /= g;
sum.b /= g;
long int part1 = sum.a / sum.b;
sum.a -= part1 * sum.b;
if (part1 != 0)
printf("%ld", part1);
if (sum.a != 0) {
if (part1 != 0)
printf(" ");
printf("%ld/%ld", sum.a, sum.b);
}
if (part1 == 0 && sum.a == 0)
printf("0");
完整代码
#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
#include<stdio.h>
#include<math.h>
#include<map>
#include<set>
#include<queue>
#include<string.h>
using namespace std;
class Ele {
public:
long int a, b;
Ele() {}
Ele(long int a, long int b) {
this->a = a;
this->b = b;
}
};
long int mygcd(long int a, long int b) {
long int temp = a;
while (a % b != 0) {
a = b;
b = temp % b;
temp = a;
}
return b;
}
int main() {
int N;
scanf("%d", &N);
vector<Ele> arr(N);
Ele sum(0, 1);
for (int i = 0; i < N; i++) {
long int tmp_a, tmp_b;
scanf("%ld/%ld", &tmp_a, &tmp_b);
if (sum.b % tmp_b != 0) {
long int new_de = sum.b * tmp_b / mygcd(sum.b, tmp_b);
sum.a *= (new_de / sum.b);
sum.b = new_de;
tmp_a *= (new_de / tmp_b);
}
else {
tmp_a *= (sum.b / tmp_b);
}
sum.a += tmp_a;
}
long int g = mygcd(sum.a, sum.b);
sum.a /= g;
sum.b /= g;
long int part1 = sum.a / sum.b;
sum.a -= part1 * sum.b;
if (part1 != 0)
printf("%ld", part1);
if (sum.a != 0) {
if (part1 != 0)
printf(" ");
printf("%ld/%ld", sum.a, sum.b);
}
if (part1 == 0 && sum.a == 0)
printf("0");
return 0;
}