当前位置: 代码迷 >> 综合 >> 个人练习-PAT甲级-1081 Rational Sum
  详细解决方案

个人练习-PAT甲级-1081 Rational Sum

热度:78   发布时间:2023-12-21 11:14:45.0

题目链接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;
}
  相关解决方案