• Twitter OA prepare: Rational Sum


    In mathematics, a rational number is any number that can be expressed in the form of a fraction p/q , where p & q are two integers, and the denominator q is not equal to zero. Hence, all integers are rational numbers  where denominator, in the most reduced form, is equal to 1.
    You are given a list of N rational number, {a1/b1, a2/b2, ..., aN/bN}. Print the sum ( = a1/b1 + a2/b2 + ... + aN/bN = num/den) in the most reduced form.
    Input
    The first line of input contains an integer, N, the number of rational numbers.  N lines follow. ithline contains two space separated integers, ai bi, where aiis the numerator and bi is the denominator for the ith rational number.
    Output
    You have to print two space separated integers, num den, where num and den are numerator and denominator of the sum respectively.
    Constraints
    1 <= N <= 15
    1 <= ai <= 10
    1 <= bi <= 10
    Notes
    Make sure the sum displayed as output is in the most reduced form.
    If sum is an integer, you have to print 1 as denominator.
    Sample Input
    4
    4 2
    2 4
    2 4
    2 3
    Sample Output
    11 3
    
    Explanation
    Sum is 4/2 + 2/4 + 2/4 + 2/3 = (24 + 6 + 6 + 8)/12 = 44/12 = 11/3. So you have to print "11 3", which is the most reduced form.

    Below is the syntax highlighted version of Rational.java from §9.2 Symbolic Methods. 摘自http://introcs.cs.princeton.edu/java/92symbolic/Rational.java.html

      1 /*************************************************************************
      2  *  Compilation:  javac Rational.java
      3  *  Execution:    java Rational
      4  *
      5  *  Immutable ADT for Rational numbers. 
      6  * 
      7  *  Invariants
      8  *  -----------
      9  *   - gcd(num, den) = 1, i.e, the rational number is in reduced form
     10  *   - den >= 1, the denominator is always a positive integer
     11  *   - 0/1 is the unique representation of 0
     12  *
     13  *  We employ some tricks to stave of overflow, but if you
     14  *  need arbitrary precision rationals, use BigRational.java.
     15  *
     16  *************************************************************************/
     17 
     18 public class Rational implements Comparable<Rational> {
     19     private static Rational zero = new Rational(0, 1);
     20 
     21     private int num;   // the numerator
     22     private int den;   // the denominator
     23 
     24     // create and initialize a new Rational object
     25     public Rational(int numerator, int denominator) {
     26 
     27         // deal with x/0
     28         //if (denominator == 0) {
     29         //   throw new RuntimeException("Denominator is zero");
     30         //}
     31 
     32         // reduce fraction
     33         int g = gcd(numerator, denominator);
     34         num = numerator   / g;
     35         den = denominator / g;
     36 
     37         // only needed for negative numbers
     38         if (den < 0) { den = -den; num = -num; }
     39     }
     40 
     41     // return the numerator and denominator of (this)
     42     public int numerator()   { return num; }
     43     public int denominator() { return den; }
     44 
     45     // return double precision representation of (this)
     46     public double toDouble() {
     47         return (double) num / den;
     48     }
     49 
     50     // return string representation of (this)
     51     public String toString() { 
     52         if (den == 1) return num + "";
     53         else          return num + "/" + den;
     54     }
     55 
     56     // return { -1, 0, +1 } if a < b, a = b, or a > b
     57     public int compareTo(Rational b) {
     58         Rational a = this;
     59         int lhs = a.num * b.den;
     60         int rhs = a.den * b.num;
     61         if (lhs < rhs) return -1;
     62         if (lhs > rhs) return +1;
     63         return 0;
     64     }
     65 
     66     // is this Rational object equal to y?
     67     public boolean equals(Object y) {
     68         if (y == null) return false;
     69         if (y.getClass() != this.getClass()) return false;
     70         Rational b = (Rational) y;
     71         return compareTo(b) == 0;
     72     }
     73 
     74     // hashCode consistent with equals() and compareTo()
     75     public int hashCode() {
     76         return this.toString().hashCode();
     77     }
     78 
     79 
     80     // create and return a new rational (r.num + s.num) / (r.den + s.den)
     81     public static Rational mediant(Rational r, Rational s) {
     82         return new Rational(r.num + s.num, r.den + s.den);
     83     }
     84 
     85     // return gcd(|m|, |n|)
     86     private static int gcd(int m, int n) {
     87         if (m < 0) m = -m;
     88         if (n < 0) n = -n;
     89         if (0 == n) return m;
     90         else return gcd(n, m % n);
     91     }
     92 
     93     // return lcm(|m|, |n|)
     94     private static int lcm(int m, int n) {
     95         if (m < 0) m = -m;
     96         if (n < 0) n = -n;
     97         return m * (n / gcd(m, n));    // parentheses important to avoid overflow
     98     }
     99 
    100     // return a * b, staving off overflow as much as possible by cross-cancellation
    101     public Rational times(Rational b) {
    102         Rational a = this;
    103 
    104         // reduce p1/q2 and p2/q1, then multiply, where a = p1/q1 and b = p2/q2
    105         Rational c = new Rational(a.num, b.den);
    106         Rational d = new Rational(b.num, a.den);
    107         return new Rational(c.num * d.num, c.den * d.den);
    108     }
    109 
    110 
    111     // return a + b, staving off overflow
    112     public Rational plus(Rational b) {
    113         Rational a = this;
    114 
    115         // special cases
    116         if (a.compareTo(zero) == 0) return b;
    117         if (b.compareTo(zero) == 0) return a;
    118 
    119         // Find gcd of numerators and denominators
    120         int f = gcd(a.num, b.num);
    121         int g = gcd(a.den, b.den);
    122 
    123         // add cross-product terms for numerator
    124         Rational s = new Rational((a.num / f) * (b.den / g) + (b.num / f) * (a.den / g),
    125                                   lcm(a.den, b.den));
    126 
    127         // multiply back in
    128         s.num *= f;
    129         return s;
    130     }
    131 
    132     // return -a
    133     public Rational negate() {
    134         return new Rational(-num, den);
    135     }
    136 
    137     // return a - b
    138     public Rational minus(Rational b) {
    139         Rational a = this;
    140         return a.plus(b.negate());
    141     }
    142 
    143 
    144     public Rational reciprocal() { return new Rational(den, num);  }
    145 
    146     // return a / b
    147     public Rational divides(Rational b) {
    148         Rational a = this;
    149         return a.times(b.reciprocal());
    150     }
    151 
    152 
    153     // test client
    154     public static void main(String[] args) {
    155         Rational x, y, z;
    156 
    157         // 1/2 + 1/3 = 5/6
    158         x = new Rational(1, 2);
    159         y = new Rational(1, 3);
    160         z = x.plus(y);
    161         System.out.println(z);
    162 
    163         // 8/9 + 1/9 = 1
    164         x = new Rational(8, 9);
    165         y = new Rational(1, 9);
    166         z = x.plus(y);
    167         System.out.println(z);
    168 
    169         // 1/200000000 + 1/300000000 = 1/120000000
    170         x = new Rational(1, 200000000);
    171         y = new Rational(1, 300000000);
    172         z = x.plus(y);
    173         System.out.println(z);
    174 
    175         // 1073741789/20 + 1073741789/30 = 1073741789/12
    176         x = new Rational(1073741789, 20);
    177         y = new Rational(1073741789, 30);
    178         z = x.plus(y);
    179         System.out.println(z);
    180 
    181         //  4/17 * 17/4 = 1
    182         x = new Rational(4, 17);
    183         y = new Rational(17, 4);
    184         z = x.times(y);
    185         System.out.println(z);
    186 
    187         // 3037141/3247033 * 3037547/3246599 = 841/961 
    188         x = new Rational(3037141, 3247033);
    189         y = new Rational(3037547, 3246599);
    190         z = x.times(y);
    191         System.out.println(z);
    192 
    193         // 1/6 - -4/-8 = -1/3
    194         x = new Rational( 1,  6);
    195         y = new Rational(-4, -8);
    196         z = x.minus(y);
    197         System.out.println(z);
    198     }
    199 
    200 }
  • 相关阅读:
    主库binlog(master-log)与从库relay-log的关系
    binlog_format不同模式下,对mysqlbinlog恢复的影响
    主从 binlog_format 设置关系
    Mysql5.7多源复制,过滤复制一段时间后增加复制一个库的实现方法
    mysql 5.7安装过程中,初始化的问题
    mysql复制过滤参数说明
    模块化发展
    Angular指令内容小结
    vue项目打包到腾讯云服务器全过程
    Centos7安装Mysql5.7
  • 原文地址:https://www.cnblogs.com/EdwardLiu/p/4200288.html
Copyright © 2020-2023  润新知