1081. Rational Sum (20) -最大公约数

题目例如以下:

Given N rational numbers in the form "numerator/denominator", you are supposed to calculate their sum.

Input Specification:

Each input file contains one test case. Each case starts with a positive integer N (<=100), followed in the next line N rational numbers "a1/b1 a2/b2 ..." where all the numerators and denominators are in the range of "long int". If there is a negative number,
then the sign must appear in front of the numerator.

Output Specification:

For each test case, output the sum in the simplest form "integer numerator/denominator" where "integer" is the integer part of the sum, "numerator" < "denominator", and the numerator and the denominator have no common factor. You must output only the fractional
part if the integer part is 0.

Sample Input 1:

5
2/5 4/15 1/30 -2/60 8/3

Sample Output 1:

3 1/3

Sample Input 2:

2
4/3 2/3

Sample Output 2:

2

Sample Input 3:

3
1/3 -1/6 1/8

Sample Output 3:

7/24

题目要求对分数进行处理。题目的关键在于求取最大公约数,最初我採用了循环出现超时,后来改用辗转相除法。攻克了此问题。

须要注意的是分子为负数的情况,为方便处理,我们把负数取绝对值,而且记录下符号。最后再输出。

辗转相除法例如以下:

给定数a、b,要求他们的最大公约数,用随意一个除以还有一个,得到余数c,假设c=0,则说明除尽。除数就是最大公约数;假设c≠0,则用除数再去除以余数,如此循环下去,直至c=0,则除数就是最大公约数,直接说比較抽象,以下用样例说明。

设a=25,b=10。c为余数

①25/10,c=5≠0,令a=10。b=5。

②10/5。c=0,则b=5就是最大公约数。

求取最大公约数的代码例如以下:

long getMaxCommon(long a, long b){
    long yu;
    if(a == b) return a;
    while(1){
        yu = a % b;
        if(yu == 0) return b;
        a = b;
        b = yu;
    }
}

完整代码例如以下:

#include <iostream>
#include <stdio.h>
#include <vector>

using namespace std;

struct Ration{
    long num;
    long den;

    Ration(long _n, long _d){
        num = _n;
        den = _d;
    }

};

long getMaxCommon(long a, long b){
    long yu;
    if(a == b) return a;
    while(1){
        yu = a % b;
        if(yu == 0) return b;
        a = b;
        b = yu;
    }
}

int main(){
    int N;
    long num,den;
    long maxDen = -1;
    cin >> N;
    vector<Ration> rations;
    for(int i = 0; i < N; i++){
        scanf("%ld/%ld",&num,&den);
        rations.push_back(Ration(num,den));
        if(maxDen == -1){
            maxDen = den;
        }else{
            // 找maxDen和当前的最小公倍数
            if(den == maxDen) continue;
            else if(maxDen > den){
                if(maxDen % den == 0) continue;
            }else{
                if(den % maxDen == 0){
                    maxDen = den;
                    continue;
                }
            }
            maxDen = maxDen * den;
        }
    }
    num = 0;
    for(int i = 0; i < N; i++){
        num += rations[i].num * (maxDen / rations[i].den);
    }
    if(num == 0) {
        printf("0\n");
        return 0;
    }
    bool negative = num < 0;
    if(negative) num = -num;
    if(num >= maxDen){
        long integer = num / maxDen;
        long numerator = num % maxDen;
        if(numerator == 0){
            if(negative)
                printf("-%ld\n",integer);
            else
                printf("%ld\n",integer);
            return 0;
        }
        long common = getMaxCommon(numerator,maxDen);
        if(negative){
            printf("%ld -%ld/%ld\n",integer,numerator/common,maxDen / common);
        }else{
            printf("%ld %ld/%ld\n",integer,numerator/common,maxDen / common);
        }
    }else{
        long common = getMaxCommon(num,maxDen);
        if(negative)
            printf("-%ld/%ld\n",num/common,maxDen/common);
        else
            printf("%ld/%ld\n",num/common,maxDen/common);
    }
    return 0;
}
时间: 2024-10-06 07:34:41

1081. Rational Sum (20) -最大公约数的相关文章

1081. Rational Sum (20)【模拟】——PAT (Advanced Level) Practise

题目信息 1081. Rational Sum (20) 时间限制400 ms 内存限制65536 kB 代码长度限制16000 B Given N rational numbers in the form "numerator/denominator", you are supposed to calculate their sum. Input Specification: Each input file contains one test case. Each case star

A.1081 Rational Sum (20)

1081 Rational Sum (20)(20 分) Given N rational numbers in the form "numerator/denominator", you are supposed to calculate their sum. Input Specification: Each input file contains one test case. Each case starts with a positive integer N (<=100

1081. Rational Sum (20)

时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue Given N rational numbers in the form "numerator/denominator", you are supposed to calculate their sum. Input Specification: Each input file contains one test case. Each case sta

PAT甲题题解-1081. Rational Sum (20)-模拟分数计算

模拟计算一些分数的和,结果以带分数的形式输出注意一些细节即可 #include <iostream> #include <cstdio> #include <algorithm> #include <cstring> #include <cmath> using namespace std; /* 模拟计算一些分数的和,结果以带分数的形式输出 注意一些细节即可 */ const int maxn=105; const int maxv=50000

PAT:1081. Rational Sum (20) AC(类似math.h中的sqrt(1.0*n),algorithm的abs()用于取绝对值)

#include<stdio.h> #include<algorithm> using namespace std; typedef long long ll; //[skill]重命名 struct num { ll zi,mu; //分子分母 }; ll gcd(ll a,ll b) //求最大公约数 { return b==0 ? a:gcd(b,a%b); } num yuefen(num a) //分数约分 { //printf("%lld/%lld.约分为:&

【PAT甲级】1081 Rational Sum (20 分)

题意: 输入一个正整数N(<=100),接着输入N个由两个整数和一个/组成的分数.输出N个分数的和. 代码: #define HAVE_STRUCT_TIMESPEC#include<bits/stdc++.h>using namespace std;int a[107],b[107];int main(){ ios::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); int n; cin>>n; for(int i

PAT (Advanced Level) 1081. Rational Sum (20)

简单模拟题. #include<cstdio> #include<cstring> #include<cmath> #include<vector> #include<map> #include<stack> #include<queue> #include<string> #include<algorithm> using namespace std; struct FenShu { long l

pat1081. Rational Sum (20)

1081. Rational Sum (20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue Given N rational numbers in the form "numerator/denominator", you are supposed to calculate their sum. Input Specification: Each input file contains one

1081 Rational Sum (20 分)分数加法

1081 Rational Sum (20 分) Given N rational numbers in the form numerator/denominator, you are supposed to calculate their sum. Input Specification: Each input file contains one test case. Each case starts with a positive integer N (≤100), followed in