zoukankan      html  css  js  c++  java
  • l1-009

    本题的要求很简单,就是求N个数字的和。麻烦的是,这些数字是以有理数“分子/分母”的形式给出的,你输出的和也必须是有理数的形式。

    输入格式:

    输入第一行给出一个正整数N(<=100)。随后一行按格式“a1/b1 a2/b2 ...”给出N个有理数。题目保证所有分子和分母都在长整型范围内。另外,负数的符号一定出现在分子前面。

    输出格式:

    输出上述数字和的最简形式 —— 即将结果写成“整数部分 分数部分”,其中分数部分写成“分子/分母”,要求分子小于分母,且它们没有公因子。如果结果的整数部分为0,则只输出分数部分。

    输入样例1:
    5
    2/5 4/15 1/30 -2/60 8/3
    
    输出样例1:
    3 1/3
    
    输入样例2:
    2
    4/3 2/3
    
    输出样例2:
    2
    
    输入样例3:
    3
    1/3 -1/6 1/8
    
    输出样例3:
    7/24

    这题主要是要理清思路。
    本来没想到用递归,但是参考了网上的答案以后,茅塞顿开。
    用递归找出整数部分的值,小数部分可以取模来解
    #define _CRT_SECURE_NO_WARNINGS
    #include <stdio.h>

    long long gcd(long long a, long long b){
        if (a == 0)
            return 0;
        else
            return (b == 0) ? a : gcd(b, a % b);
    }

    int main(){
        int N;
        long long lcp;
        long long a, b, c, d;
        int i = 1;
        scanf("%d", &N);
        scanf("%lld/%lld", &a, &b);
        int t0 = gcd(a, b);
        if (a){
            a /= t0;
            b /= t0;
        }

        while (i < N){
            scanf("%lld/%lld", &c, &d);
            lcp = b / gcd(b, d) * d;
            a = a * lcp / b + c * lcp / d;
            b = lcp;
            int t0 = gcd(a, b);
            if (t0 != 0){
                a = a / t0;
                b = b / t0;
            }
            i++;
        }
        if (a && a / b == 0)
            printf("%lld/%lld ", a%b, b);
        else if (a%b == 0)
            printf("%lld ", a / b);
        else
            printf("%lld %lld/%lld ", a / b, a%b, b);
        return 0;
    }
  • 相关阅读:
    Hibernate 配置双向多对多关联
    转 方法区(method) )、栈区(stack)和堆区(heap)之JVM 内存初学
    java web 实战经典(二)
    flex 生成多边形时内、外环计算
    java web 开发实战经典(一)
    sql语句联表更新(从一个数据库中的一张表更新到另一个数据库的另一张表)
    javascript DOM编程艺术(检测与性能优化)
    java数据库基本操作(sqlserver 2000为例)
    同一台电脑上配置多个解压版tomcat方法(本例安装两个)
    css那些事(一)
  • 原文地址:https://www.cnblogs.com/jjyyxx666666/p/6598876.html
Copyright © 2011-2022 走看看