zoukankan      html  css  js  c++  java
  • 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
    ");
            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
    ",integer);
                else
                    printf("%ld
    ",integer);
                return 0;
            }
            long common = getMaxCommon(numerator,maxDen);
            if(negative){
                printf("%ld -%ld/%ld
    ",integer,numerator/common,maxDen / common);
            }else{
                printf("%ld %ld/%ld
    ",integer,numerator/common,maxDen / common);
            }
        }else{
            long common = getMaxCommon(num,maxDen);
            if(negative)
                printf("-%ld/%ld
    ",num/common,maxDen/common);
            else
                printf("%ld/%ld
    ",num/common,maxDen/common);
        }
        return 0;
    }
    


  • 相关阅读:
    Laravel-RestfulAPI 资源控制器(全面详解)
    Laravel 支付宝SDK在Laravel5的封装
    Laravel 集成 阿里大于 短信接口
    Laravel --进阶篇 (单用户登录)
    Laravel LTS 分割 路由文件的最佳方式
    Laravel -- 实战篇 自制二维码 Simple QrCode
    Laravel 使用 Aliyun OSS 云存储
    Laravel 富文本插件-Ueditor
    Laravel 实战篇
    Laravel 微信开发组件-WeChat 微信支付
  • 原文地址:https://www.cnblogs.com/aiwz/p/6154051.html
Copyright © 2011-2022 走看看