PAT乙級1005 3n 1續 C語言

2021-10-17 04:57:07 字數 1617 閱讀 3122

卡拉茲(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進行驗證的時候,就可以直接判定卡拉茲猜...