卡拉茲(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輸出格式: 每個測試用例的輸出佔一行,按從大到小的順序輸出關鍵數字。數字間用 1 個空格隔開,但一行中最後乙個數字後沒有空格。
輸入樣例: 6 3 5 6 7 8 11 輸出樣例: 7 6
一共有兩個陣列:
1)二維陣列valided_num,用於儲存不同數字對應的序列,用到的數字對應的位置為1
例如:第一輪中,用到了3,那麼valided_num[0][3]=1
2)當前計算得到的關鍵數key_num,後序會不斷地更新
例如:第一輪3是關鍵數,所以key_num[3] = 1
遍歷輸入數字時:
1)若當前數字在之前的陣列裡存在,則該數字必然不是關鍵數字
2)若當前數字在之前陣列裡不存在,運算callatz直至結束
計算當前輸入數字的valided_num,並遍歷key_num,若key_num中有數存在於valided_num,則置0
最後按照要求倒序輸出即可
**注意**中部分索引值重用
#define _crt_secure_no_warnings
# include
# define max 101
//由於用0,1標記是否用到,所以要101個陣列來保證索引值為100時陣列不會越界
void
callatz
(int num,
int* used_num)
intmain()
;int key_num[max]=;
int result[max]
;scanf
("%d"
,&num)
;while
(count < num)}if
(judge)
key_num[cal_num]=1
;}count++;}
count =0;
for(
int index =
0; index <
101; index++
)while
(count--
>1)
printf
("%d"
,result[count]);
}
如果有更簡便的方法歡迎指出呀! pat 乙級 1005 3n 1猜想
題目鏈結 輸入 6 3 5 6 7 8 11 輸出 7 6思路 1 用陣列arr下標來標記輸入的數字,如果這個數字是重複驗證過的 那麼就將其陣列的值修改為1作為記號 2 使用向量vector來表示輸入的每個值,利用向量可以定位到資料的位址i0 1234 5678 9101112 1314 1516 ...
PAT乙級 繼續 3n 1 猜想
卡拉茲 callatz 猜想已經在1001中給出了描述。在這個題目裡,情況稍微有些複雜。當我們驗證卡拉茲猜想的時候,為了避免重複計算,可以記錄下遞推過程中遇到的每乙個數。例如對 n 3 進行驗證的時候,我們需要計算 3 5 8 4 2 1,則當我們對 n 5 8 4 2 進行驗證的時候,就可以直接判...
PAT乙級 繼續(3n 1 猜想
卡拉茲 callatz 猜想已經在1001中給出了描述。在這個題目裡,情況稍微有些複雜。當我們驗證卡拉茲猜想的時候,為了避免重複計算,可以記錄下遞推過程中遇到的每乙個數。例如對n 3進行驗證的時候,我們需要計算3 5 8 4 2 1,則當我們對n 5 8 4 2進行驗證的時候,就可以直接判定卡拉茲猜...