zoukankan      html  css  js  c++  java
  • A1081. Rational Sum

    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 #include<cstdio>
     2 #include<iostream>
     3 #include<algorithm>
     4 using namespace std;
     5 typedef struct{
     6     long long up, down;
     7 }fra;
     8 long long gcd(long long a, long long b){
     9     a = abs(a);
    10     b = abs(b);
    11     if(b == 0)
    12         return a;
    13     else return gcd(b, a % b);
    14 }
    15 fra cacul(fra a, fra b){
    16     fra temp;
    17     temp.down = a.down * b.down;
    18     temp.up = a.down * b.up + b.down * a.up;
    19     long long fact = gcd(temp.up, temp.down);
    20     temp.down = temp.down / fact;
    21     temp.up = temp.up / fact;
    22     return temp;
    23 }
    24 int main(){
    25     int N;
    26     fra re = {0,1}, temp = {0, 1};
    27     scanf("%d", &N);
    28     for(int i = 0; i < N; i++){
    29         scanf("%lld/%lld", &temp.up, &temp.down);
    30         re = cacul(re, temp);
    31     }
    32     if(re.up == 0){
    33         printf("0");
    34     }else if(abs(re.up) == abs(re.down)){
    35         printf("%lld", re.up / re.down);
    36     }else if(abs(re.up) > abs(re.down)){
    37         if(re.up % re.down == 0)
    38             printf("%d", re.up / re.down);
    39         else
    40             printf("%lld %lld/%lld", re.up / re.down, re.up % re.down, re.down);
    41     }else{
    42         printf("%lld/%lld", re.up, re.down);
    43     }
    44     cin >> N;
    45     return 0;
    46 }
    View Code

    总结:

    1、分数运算化简:化简时分子分母同除最大公因数。 输出时考虑:分子为0时直接输出0;分子>=分母时(用绝对值比较,是>=而非>),可以整除则输出整数,否则输出代分数(4/1直接输出4);

    2、gcd函数:

    int gcd(int a, int b){ 
    if(b == 0) return a; else return gcd(b, a % b); }
  • 相关阅读:
    retain和copy的区别 #import @class 的区别
    UImageview加边框 加阴影
    iOS中有两种支持机制:Notification和KVO(KeyValue Observing)
    Windows上编译,学习Objectivec
    CAAnimation动画
    ObjectiveC 熟记小概念
    cocos2d工具大全
    cocos2d 0.99.5版本屏幕默认是横屏,怎么修改为竖屏呢?
    ObjectiveC 的 self 和 super 详解
    ObjectiveC 的属性与合成方法使用详解
  • 原文地址:https://www.cnblogs.com/zhuqiwei-blog/p/8516710.html
Copyright © 2011-2022 走看看