pta 7-1 N個數求和 (20分)(分數相加)


本題的要求很簡單,就是求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
'''

 



 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM