• 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); }
  • 相关阅读:
    Codeforces Round #615 (Div. 3)
    「网络流 24 题」最长 k 可重区间集
    「网络流 24 题」方格取数
    「网络流 24 题」试题库
    debian服务sh启动java,设置开机启动
    debian重置root密码
    uwsgi加载ini文件,nginx重新加载,查看配置文件路劲
    pptpd启动
    android studio java lib不能直接运行
    clipChildren是否限制子控件在该容器所在的范围内
  • 原文地址:https://www.cnblogs.com/zhuqiwei-blog/p/8516710.html
Copyright © 2020-2023  润新知