zoukankan      html  css  js  c++  java
  • 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 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
    思路
      先加再化简
    #include<iostream>
    #include<vector>
    #include<algorithm>
    #include<map>
    #include<set>
    #include<cmath>
    #include<climits>
    #include<sstream>
    #include<cstdio>
    #include<string.h>
    #include<unordered_map>
    using namespace std;
    struct Fraction
    {
        int up;
        int down;
    };
    int gcd(int a,int b)
    {
        if(b==0)
            return a;
        return gcd(b,a%b);
    }
    void reduction(Fraction &temp)
    {
        if(temp.up==0)
            temp.down=1;
        int t=gcd(abs(temp.up),temp.down);
        temp.up/=t;
        temp.down/=t;
    }
    
    void add(Fraction &sum,Fraction &temp)
    {
        sum.up=sum.up*temp.down+sum.down*temp.up;
        sum.down=sum.down*temp.down;
        reduction(sum);
    }
    
    
    
    int main()
    {
        int n;
        scanf("%d",&n);
        Fraction sum,temp;
        for(int i=0;i<n;i++)
        {
            scanf("%d/%d",&temp.up,&temp.down);
            if(i==0)
                sum=temp;
            else
                add(sum,temp);
        }
        int it=sum.up/sum.down;
        if(it>0)
        {
            printf("%d",it);
            sum.up=sum.up%sum.down;
            if(sum.up!=0)
                printf(" %d/%d",sum.up,sum.down);
            return 0;
        }
        if(sum.up==0)
            printf("0");
        else
            printf("%d/%d",sum.up,sum.down);
        return 0;
    }
     
  • 相关阅读:
    进程和线程的一个简单形象的解释
    java流的性能优化1-文件复制
    JAVA修饰符类型(public,protected,private,friendly)
    Codeforces Round #252 (Div. 2) 441B. Valera and Fruits
    游戏开场镜头拉近(Unity3D开发之四)
    P1282 多米诺骨牌
    P1280 尼克的任务
    求最小生成树(暴力法,prim,prim的堆优化,kruskal)
    暴力求最短路
    用MyEclipse将java文件转换成UML类图
  • 原文地址:https://www.cnblogs.com/zhanghaijie/p/10348222.html
Copyright © 2011-2022 走看看