# -*- coding: utf-8 -*-
# @Time : 2019-09-17 12:08
# @Author : Jayce Wong
# @ProjectName : job
# @FileName : continued_fraction.py
# @Blog : https://blog.51cto.com/jayce1111
# @Github : https://github.com/SysuJayce
"""
(1)連分數比大小
連分數可以表示爲(a0;a1,a2,……,an),這樣直觀的數學表示爲:
輸入
n,之後是n+1個數字,分別表示a0,a1,……,an
m,之後是m+1個數字,分別表示b0,b1,……,bn
要求比較以上兩個連分數(分別記爲x和y)的大小,n和m不超過100000
輸出
若x>y,輸出“>”,若x<y,輸出“<”,否則輸出“=”
"""
def compareContinuedFraction():
"""
從下標爲0開始一直到下標爲n,逐個比對a[i]和b[i]的大小。
當有一個數組比對到了最後一個元素之後,如果該下標的a[i]和b[i]一樣大,由於有一個數組已經沒有待
比對的元素了,因此那個較短的數組在該下標 判斷爲 小於 較長的數組。
**關鍵在於**,在某一個下標判斷出了大小之後,需要從該下標往回比較,由於是在分母位置,因此往回
傳遞大小的時候與當前位置的大小相反。
4 1 2 3 4 4 1 2 3 4
0 0 0 0 + -> + - + - +
4 1 2 3 3 4 1 2 3 3
上面的+代表1,-代表-1,0代表0
當比對到任意一個數組的末尾或者比對出了大小關係之後,往回傳遞,這時候傳遞的結果是大小交替的
因此,在上面的例子中,比對到最後一個元素的時候是+,然後開始往回傳遞(遞歸中的歸),最後到達
下標爲0的位置的時候的大小結果就是最終的大小結果。
:return:
"""
def helper(idx):
# 這裏只是單純的比較對應下標的元素的大小
if a[idx] > b[idx]:
return 1
if a[idx] < b[idx]:
return -1
# 如果同時到達數組末尾,那麼說明這兩個連分數大小一樣
if idx == n == m:
return 0
# 如果a比較短,那麼b後面剩下的元素都不用比了,在這一個下標判a[i] < b[i]
if idx == n:
return -1
# 反之亦然
if idx == m:
return 1
# 如果在數組的開頭沒有比較出大小,那麼就往後逐個比對
k = helper(idx + 1)
# 當後面的比對得出結果之後,往回傳遞,這時候注意將大小對調
if k > 0:
return -1
if k < 0:
return 1
return 0
# 在初始化變量的時候,*a可以作爲一個列表變量
n, *a = list(map(int, input().split(' ')))
m, *b = list(map(int, input().split(' ')))
res = helper(0)
print({0: '=', 1: '>', -1: '<'}[res])
compareContinuedFraction()
比較兩個連分數的大小
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.