繼續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