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 }
时间: 2024-08-02 15:12:18

Twitter OA prepare: Rational Sum的相关文章

Twitter OA prepare: even sum pairs

Write a function: class Solution { public int solution(int[] A); } that, given an array A consisting of N integers, returns the number of pairs (P, Q) such that 0 ≤ P < Q < N and (A[P] + A[Q]) is even. The function should return −1 if the number of

Twitter OA prepare: Equilibrium index of an array

Equilibrium index of an array is an index such that the sum of elements at lower indexes is equal to the sum of elements at higher indexes. For example, in an arrya A: A[0] = -7, A[1] = 1, A[2] = 5, A[3] = 2, A[4] = -4, A[5] = 3, A[6]=0 3 is an equil

Twitter OA prepare: K-complementary pair

A non-empty zero-indexed array A consisting of N integers is given. A pair of integers (P, Q) is called K-complementary in array A if 0 ≤ P, Q < N and A[P] + A[Q] = K. For example, consider array A such that: A[0] = 1 A[1] = 8 A[2]= -3 A[3] = 0 A[4]

Twitter OA prepare: Flipping a bit

You are given a binary array with N elements: d[0], d[1], ... d[N - 1]. You can perform AT MOST one move on the array: choose any two integers [L, R], and flip all the elements between (and including) the L-th and R-th bits. L and R represent the lef

Twitter OA prepare: Anagram is A Palindrome

A string is a palindrome if it has exactly the same sequence of characters when traversed left-to-right as right-to-left. For example, the following strings are palindromes: "kayak" "codilitytilidoc" "neveroddoreven" A string

Twitter OA prepare: Visit element of the array

A zero-indexed array A consisting of N integers is viven. We visit the indexs of the array in the following way. In the first step we visit the index 0; in every subsequent step we move from the visited index K to the index: M = K + A[K]; provided M

1081. Rational Sum (20)【模拟】——PAT (Advanced Level) Practise

题目信息 1081. Rational Sum (20) 时间限制400 ms 内存限制65536 kB 代码长度限制16000 B 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 star

pat1081. Rational Sum (20)

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

A.1081 Rational Sum (20)

1081 Rational Sum (20)(20 分) 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