zoukankan      html  css  js  c++  java
  • PAT1081:Rational Sum

    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 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

    思路

    分子相加的运算。
    1.辗转相除法求分子分母的最大公约数
    2.两分数相加后要化简,不然容易在计算时产生溢出。
    3.输出需要特别注意的格式:
    1)在整数不为0的情况下,分数为0则只输出整数。
    2)在整数为0的情况下,分数不为0则只输出分数。
    3)二者都为0直接输出一个0。
    4)二者都不为0按题目要求的标准格式输出。
    4.关于分母为0的情况,题目测试用例好像并未考虑,暂不做处理。

    代码
    #include<iostream>
    using namespace std;
    typedef long long ll;
    
    ll gcd(ll a,ll b) //求最大公约数
    {
       return b == 0?abs(a):gcd(b,a % b);
    }
    int main()
    {
       ll N,a,b,gvalue,suma,sumb;
       while( cin >> N)
       {
           suma = 0,sumb = 1;
           for(int i = 0;i < N;i++)
           {
               scanf("%lld/%lld",&a,&b);
               gvalue = gcd(a,b);
               //约分
               a /= gvalue;
               b /= gvalue;
               //分数求公倍数相加
               suma = a * sumb + b * suma;
               sumb = b * sumb;
               //分子和约分
               gvalue = gcd(suma,sumb);
               suma /= gvalue;
               sumb /= gvalue;
           }
           ll integer = suma / sumb;
           ll numerator = suma - integer * sumb;
           if(integer != 0)
           {
              cout << integer;
              if(numerator != 0)
              {
                  cout << " ";
                  printf("%lld/%lld",numerator,sumb);
              }
           }
           else
           {
              if(numerator != 0)
              {
                  printf("%lld/%lld",numerator,sumb);
              }
              else
                  cout << 0;
           }
           cout << endl;
       }
    }
    

      

  • 相关阅读:
    【ZOJ3195】Design the City-LCA算法
    【ZOJ3195】Design the City-LCA算法
    【POJ1330】Nearest Common Ancestors-LCA算法
    【POJ1330】Nearest Common Ancestors-LCA算法
    【POJ3237】Tree-树链剖分
    【POJ3237】Tree-树链剖分
    【SPOJ375】Query on a tree-树链剖分
    perl 回调必须是函数引用
    运行复制的ZooKeeper 部署
    运行复制的ZooKeeper 部署
  • 原文地址:https://www.cnblogs.com/0kk470/p/7872145.html
Copyright © 2011-2022 走看看