本题的要求很简单,就是求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 '''