卡拉茲(callatz)猜想已經在1001中給出了描述。在這個題目裡,情況稍微有些複雜。
當我們驗證卡拉茲猜想的時候,為了避免重複計算,可以記錄下遞推過程中遇到的每乙個數。例如對 n=3 進行驗證的時候,我們需要計算 3、5、8、4、2、1,則當我們對 n=5、8、4、2 進行驗證的時候,就可以直接判定卡拉茲猜想的真偽,而不需要重複計算,因為這 4 個數已經在驗證3的時候遇到過了,我們稱 5、8、4、2 是被 3「覆蓋」的數。我們稱乙個數列中的某個數 n 為「關鍵數」,如果 n 不能被數列中的其他數字所覆蓋。
現在給定一系列待驗證的數字,我們只需要驗證其中的幾個關鍵數,就可以不必再重複驗證餘下的數字。你的任務就是找出這些關鍵數字,並按從大到小的順序輸出它們。
卡拉茲(callatz)猜想:
對任何乙個正整數 n,如果它是偶數,那麼把它砍掉一半;如果它是奇數,那麼把 (3n+1) 砍掉一半。這樣一直反覆砍下去,最後一定在某一步得到 n=1。(題目1001具體分析)
每個測試用例的輸出佔一行,按從大到小的順序輸出關鍵數字。數字間用 1 個空格隔開,但一行中最後乙個數字後沒有空格。
每個測試用例的輸出佔一行,按從大到小的順序輸出關鍵數字。數字間用 1 個空格隔開,但一行中最後乙個數字後沒有空格。
635
67811
7
6
這道題目有多種實現方式,最直觀的思路就是建立乙個陣列儲存對於每乙個輸入資料計算過程中生成的數,並去重,然後再乙個個比較生成陣列中的數以及輸入的數,刪除兩者中相同的數字,最終剩下的就是我們要求得的關鍵數;
本文使用了另外一種方法,同樣的建立乙個陣列,但是對應儲存的資料不是陣列內容,而是陣列的下標,這一方法在很多題目中有過靈巧的應用,可能稍微多占用了一些儲存空間,但是卻節省了計算資源,可以說是用空間換時間;
很多題目中會涉及到諸如「輸出一行數字,中間用空格隔開,最後乙個數字沒有空格」此類的要求,這裡提供乙個簡單易實現的寫法:在printf引數後面加上–i ? 』 』 : 『\0』(其中i為子專案數目)
符號解釋:對於條件表示式b ? x : y,先計算條件b,然後進行判斷。如果b的值為true,計算x的值,運算結果為x的值;否則,計算y的值,運算結果為y的值。
即i>0時,後面輸出空格,i==0時,後面輸出結束符,即結束輸出。
#include
intmain()
;scanf
("%d"
,&k)
;for
(int i =
0; i < k; i++
)/* 對於每乙個輸入的數字進行處理 */
for(
int i =
1; i <=
100; i++)if
(table[i]
)for
(int j = i; j >1;
)}for(
int i =
100; i >=
1; i--)if
(table[i]==1
)printf
("%d%c"
, i,
--k ?
' ':
'\0');
/* 中間用空格隔開,最後乙個數字沒有空格 */
return0;
}
PAT(乙級)1005 繼續 3n 1 猜想
題目 卡拉茲 callatz 猜想已經在1001中給出了描述。在這個題目裡,情況稍微有些複雜。當我們驗證卡拉茲猜想的時候,為了避免重複計算,可以記錄下遞推過程中遇到的每乙個數。例如對n 3進行驗證的時候,我們需要計算3 5 8 4 2 1,則當我們對n 5 8 4 2進行驗證的時候,就可以直接判定卡...
PAT 乙級 1005 繼續 3n 1 猜想
時間限制 400 ms 記憶體限制 65536 kb 長度限制 8000 b 判題程式 standard 作者 chen,yue 卡拉茲 callatz 猜想已經在1001中給出了描述。在這個題目裡,情況稍微有些複雜。當我們驗證卡拉茲猜想的時候,為了避免重複計算,可以記錄下遞推過程中遇到的每乙個數。...
PAT乙級1005 繼續 3n 1 猜想
卡拉茲 callatz 猜想已經在1001中給出了描述。在這個題目裡,情況稍微有些複雜。當我們驗證卡拉茲猜想的時候,為了避免重複計算,可以記錄下遞推過程中遇到的每乙個數。例如對n 3進行驗證的時候,我們需要計算3 5 8 4 2 1,則當我們對n 5 8 4 2進行驗證的時候,就可以直接判定卡拉茲猜...