PAT上分記(python + 完美過關)---1005---繼續3n+1猜想

繼續3n+1猜想

卡拉茲(Callatz)猜想已經在1001中給出了描述。在這個題目裏,情況稍微有些複雜。

當我們驗證卡拉茲猜想的時候,爲了避免重複計算,可以記錄下遞推過程中遇到的每一個數。例如對 n=3 進行驗證的時候,我們需要計算 3、5、8、4、2、1,則當我們對 n=5、8、4、2 進行驗證的時候,就可以直接判定卡拉茲猜想的真僞,而不需要重複計算,因爲這 4 個數已經在驗證3的時候遇到過了,我們稱 5、8、4、2 是被 3“覆蓋”的數。我們稱一個數列中的某個數 n 爲“關鍵數”,如果 n 不能被數列中的其他數字所覆蓋。

現在給定一系列待驗證的數字,我們只需要驗證其中的幾個關鍵數,就可以不必再重複驗證餘下的數字。你的任務就是找出這些關鍵數字,並按從大到小的順序輸出它們。

輸入格式:
每個測試輸入包含 1 個測試用例,第 1 行給出一個正整數 K (<100),第 2 行給出 K 個互不相同的待驗證的正整數 n (1<n≤100)的值,數字間用空格隔開。

輸出格式:
每個測試用例的輸出佔一行,按從大到小的順序輸出關鍵數字。數字間用 1 個空格隔開,但一行中最後一個數字後沒有空格。

輸入樣例:
6
3 5 6 7 8 11

輸出樣例:
7 6

def get_step_list(n):
    sum_step = 0
    step_list = list()
    while(n != 1):
        sum_step += 1
        if (n % 2 == 0):
            n = n // 2
        else:
            n = (3*n+1) // 2
        step_list.append(n)
    step_list = list(set(step_list))
    step_list.remove(1)
    return step_list


def out_put_louwer(out): # 選擇排序,輸出排序後的列表
    for i in range(len(out)):
        min_index = i
        for j in range(i+1, len(out)):
            if out[j]>out[min_index]:
                min_index = j
        if min_index != i:
            temp = out[i]
            out[i] = out[min_index]
            out[min_index] = temp
    return out


if __name__ == '__main__':
    n = eval(input(''))
    input_list = list()
    call_list = list()
    out_list = list()
    input_list = input()
    input_list = input_list.split(' ')
    
    for j in range(len(input_list)):
        call_list.append(get_step_list(int(input_list[j])))
    
    for k in range(len(input_list)):
        flag = 0
        for l in range(len(input_list)):
            if call_list[l].count(int(input_list[k])) != 0:
                flag += 1
        if flag == 0:
            out_list.append(int(input_list[k]))
    
    out_list = out_put_louwer(out_list)
    i_index = 0
    for i in out_list:
        if i_index != len(out_list) - 1:
            i_index += 1
            print(i, end=' ')
        else:
            print(i, end='')
            i_index += 1
        
    
    
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章