2018愛奇藝校招【循環數比較】Python解法

題目描述

對於任意兩個正整數x和k,我們定義repeat(x, k)爲將x重複寫k次形成的數,例如repeat(1234, 3) = 123412341234,repeat(20,2) = 2020.
牛牛現在給出4個整數x1, k1, x2, k2, 其中v1 = (x1, k1), v2 = (x2, k2),請你來比較v1和v2的大小。

輸入描述:

輸入包括一行,一行中有4個正整數x1, k1, x2, k2(1 ≤ x1,x2 ≤ 10^9, 1 ≤ k1,k2 ≤ 50),以空格分割

輸出描述:

如果v1小於v2輸出"Less",v1等於v2輸出"Equal",v1大於v2輸出"Greater".

思路

兩個正整數循環不同的次數得到兩個整數,比較這兩個數的大小。首先,考慮得到的數字會很大,因此,不可能在數字域進行比較,轉換到字符串域進行。

比較數字的大小,首先要比長度,如果長度不等,則更長的數比較大;如果長度相等,再設計算法進行比較。

題目中說明,數字是由正整數循環得到的,因此是有規律可循的,博主採用比較兩個數公共的循環長度內的數字大小的方式設計算法,進一步降低了複雜度。而兩個數的公共最小循環長度,則是兩個基本正整數長度的最小公倍數。

以下是Python代碼:

line = input().split()
x1, lx1 = line[0], len(line[0])
k1 = int(line[1])
x2, lx2 = line[2], len(line[2])
k2 = int(line[3])
# 最小公倍數函數
def lcm(x, y):
    if x > y:
        greater = x
    else:
        greater = y

    while(True):
        if((greater % x == 0) and (greater % y == 0)):
            lcm = greater
            break
        greater += 1
    return lcm

if lx1*k1 < lx2 * k2:
    print('Less')
elif lx1*k1 > lx2*k2:
    print('Greater')
else:
    for i in range(lcm(lx1, lx2)):
        if x1[i%lx1] < x2[i%lx2]:
            print('Less')
            exit()
        elif x1[i%lx1] > x2[i%lx2]:
            print('Greater')
            exit()
    print('Equal')
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章