本題的要求很簡單,就是求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
方法一: 用python的Fraction函數
但是時間太長
from fractions import Fraction import math t = 1 while t: t-=1 n = (int)(input()) b = list(input().split()) #print(b) c = Fraction(0,1) for i in b: c = Fraction(i) + c c = str(c) #print(c) try: s1,s2 = c.split("/") a = int(s1) b = int(s2) if (a<0): print('-',end = "") a = -a if (a//b): print(a//b,end=" ") print(a%b,end = '/') print(b) except: print(c) ''' 5 2/5 4/15 1/30 -2/60 8/3 '''
方法二:用python 自己模擬了一下,時間更長了233
from fractions import Fraction import math n = int(input()) l = list(input().split()) a = 0 b = 0 for each in l: fz = 0 fm = 0 fz,fm = map(int,each.split("/")) yue = math.gcd(fz, fm) fz = fz/yue fm = fm/yue if a==0 and b==0 : a = fz b = fm else: for i in range(1,10000000000): if fm*i%b == 0: fm = i * fm fz = i * fz a = fm // b * a b = fm a+=fz break yue = math.gcd(int(a),int(b)) a = a/yue b = b/yue if a < 0: print("-", end = "") a = -a if (a%b==0): print (int(a // b)) elif (a//b==0): print(int(a),end = "/") print(int(b)) else: print(int(a//b), end = " ") print(int(a-a//b*b), end = "/") print(int(b)) ''' 5 2/5 4/15 1/30 -2/60 8/3 2 -3 1/2 '''
接着,我用了這個公式 gcd(a,b)*
LCM(a,b) = |a*b|來求最小公倍數,時間從100+ms減到了30+ms,當然還是比c慢
from fractions import Fraction from math import gcd import math n = int(input()) l = list(input().split()) a = 0 b = 0 for each in l: fz = 0 fm = 0 fz,fm = map(int,each.split("/")) yue = gcd(int(fz), int(fm)) fz = fz/yue fm = fm/yue lcm = 0 if a==0 and b==0 : a = fz b = fm else: lcm = b*fm//gcd(int(b),int(fm)) a = lcm/b*a + lcm/fm*fz b = lcm yue = gcd(int(a),int(b)) a = a/yue b = b/yue if a < 0: print("-", end = "") a = -a if (a%b==0): print (int(a // b)) elif (a//b==0): print(int(a),end = "/") print(int(b)) else: print(int(a//b), end = " ") print(int(a-a//b*b), end = "/") print(int(b)) ''' 5 2/5 4/15 1/30 -2/60 8/3 2 -3 1/2 '''