1. 程式人生 > >PAT Basic 1005. 繼續(3n+1)猜想(C語言實現)

PAT Basic 1005. 繼續(3n+1)猜想(C語言實現)

題目

卡拉茲(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

思路

初步思路:

1.按個數讀入陣列。

2.從第一個元素開始,逐步計算猜想數,對每一個猜想數遍歷陣列,將相等的元素置為0並計數。

3.氣泡排序。

4.順序輸出並新增空格。

改進思路:

考慮到輸入資料範圍有限,可以通過設定足夠範圍的陣列來省去排序的步驟。即設定0~100陣列,將元素放入對應位置。

(注意猜想數有可能超出100範圍,防止陣列下標越界)

程式碼如下:

#include <stdio.h>
int main()
{
    int K=0, n=0;
    int tabel[101] = {0};
    scanf("%d", &K);
    //將元素對應位置標記為1 
    for(int i = 0; i < K; i++)
    {
        scanf("%d", &n);
        tabel[n] = 1;
    }
    //遍歷陣列,求還存在數的猜想數 
    for(int i = 1; i <= 100; i++)
    { 
		if(tabel[i])
	    {
	        for(n = i; n > 1; )
	        {
	            if(n % 2)
				{
					n = (3 * n + 1) / 2;
				} 
	            else
				{
					n /= 2;
				} 
	            //檢驗猜想數是否存在,需考慮猜想數超出100,陣列越界的問題 
	            if(n <= 100 && tabel[n])
	            {
	                tabel[n] = 0;
	                K--;
	            }
	        }
	    }
    } 
    for(int i = 100; i >= 1; i--)
	{
		if(tabel[i] == 1)
	    {
	        printf("%d%c", i, --K ? ' ' : '\0');
	    }
	} 
    
    return 0;
}

相關推薦

PAT Basic 1005. 繼續(3n+1)猜想C語言實現

題目 卡拉茲(Callatz)猜想已經在1001中給出了描述。在這個題目裡,情況稍微有些複雜。 當我們驗證卡拉茲猜想的時候,為了避免重複計算,可以記錄下遞推過程中遇到的每一個數。例如對n=3進行驗證的時候,我們需要計算3、5、8、4、2、1,則當我們對n=5、8、4、2進

PAT乙級1005. 繼續(3n+1)猜想C語言

/* * (3n+1)猜想 的迴圈計算條件是 數字 != 1 * 不能被數列中的其他數字所覆蓋為“關鍵數” ----> 能被覆蓋的數最終也會變成1; * 即 遍歷數列,將非關鍵數改為1後,剩下的就是關鍵數。 */ #inclu

1005 繼續(3n+1)猜想C語言版 + 註釋 + 複雜對映

卡拉茲(Callatz)猜想已經在1001中給出了描述。在這個題目裡,情況稍微有些複雜。 當我們驗證卡拉茲猜想的時候,為了避免重複計算,可以記錄下遞推過程中遇到的每一個數。例如對 n=3 進行驗證的時候,我們需要計算 3、5、8、4、2、1,則當我們對 n=5、8、4、2

PAT1005 繼續(3n+1)猜想25 分C語言

PAT 1005 繼續(3n+1)猜想(25 分) C語言 #include<stdio.h> int main() { int n; scanf("%d", &n); //輸入n個整數 int zs[n]; for(in

PAT 乙級 1005 繼續(3n+1)猜想散列表

1005 繼續(3n+1)猜想 (25)(25 分) 卡拉茲(Callatz)猜想已經在1001中給出了描述。在這個題目裡,情況稍微有些複雜。 當我們驗證卡拉茲猜想的時候,為了避免重複計算,可以記錄下遞推過程中遇到的每一個數。例如對n=3進行驗證的時候,我們需要計算3、5

PAT Basic 1025. 反轉連結串列 (25)C語言實現

, CSDN內容暫時不更新(將來有計劃更新), 請前往連結檢視最新內容. 歡迎star 我的repo題目給定一個常數K以及一個單鏈表L,請編寫程式將L中每K個結點反轉。例如:給定L為

PAT Basic 1052. 賣個萌 (20)C語言實現

, CSDN內容暫時不更新(將來有計劃更新), 請前往連結檢視最新內容. 歡迎star 我的repo題目萌萌噠表情符號通常由“手”、“眼”、“口”三個主要部分組成。簡單起見,我們假設

PAT Basic 1033. 舊鍵盤打字(20)C語言實現

, CSDN內容暫時不更新(將來有計劃更新), 請前往連結檢視最新內容. 歡迎star 我的repo題目舊鍵盤上壞了幾個鍵,於是在敲一段文字的時候,對應的字元就不會出現。現在給出應該

PAT Basic 1017. A除以B (20)C語言實現

, CSDN內容暫時不更新(將來有計劃更新), 請前往連結檢視最新內容. 歡迎star 我的repo題目本題要求計算A/B,其中A是不超過1000位的正整數,B是1位正整數。你需要輸

PAT Basic 1053. 住房空置率 (20)C語言實現

, CSDN內容暫時不更新(將來有計劃更新), 請前往連結檢視最新內容. 歡迎star 我的repo題目在不打擾居民的前提下,統計住房空置率的一種方法是根據每戶用電量的連續變化規律進

PAT (Basic Level) Practice 中文1005 繼續(3n+1)猜想 25 分_C語言實現

題目地址 題目解析:這裡我的處理方式有一定簡潔性,可供參考。 我的程式碼: #include<stdio.h> int main() { int n,aa[101]={0};//構建包含下標2-100的陣列(輸入的數字的範圍)記錄每次運算的情況 scanf

PAT-1005 繼續(3n+1)猜想 25 分

1005 繼續(3n+1)猜想 (25 分) 卡拉茲(Callatz)猜想已經在1001中給出了描述。在這個題目裡,情況稍微有些複雜。 當我們驗證卡拉茲猜想的時候,為了避免重複計算,可以記錄下遞推過程

PAT 乙級 1005 繼續(3n+1)猜想 (25)25 分

1005 繼續(3n+1)猜想 (25)(25 分) 卡拉茲(Callatz)猜想已經在1001中給出了描述。在這個題目裡,情況稍微有些複雜。 當我們驗證卡拉茲猜想的時候,為了避免重複計算,可以記錄下遞推過程中遇到的每一個數。例如對n=3進行驗證的時候,我們需要計算3、5

PAT】B1005 繼續(3n+1)猜想25 分

tdi can scanf code ret return amp emp ++ #include<stdio.h> #include<algorithm> using namespace std; int Table[1000]={0}; bool

PAT-乙級-1005 繼續(3n+1)猜想

避免 names iostream base clu 測試 順序輸出 math problem 卡拉茲(Callatz)猜想已經在1001中給出了描述。在這個題目裏,情況稍微有些復雜。 當我們驗證卡拉茲猜想的時候,為了避免重復計算,可以記錄下遞推過程中遇到的每一個數。

1005 繼續(3n+1)猜想 25 分

卡拉茲(Callatz)猜想已經在1001中給出了描述。在這個題目裡,情況稍微有些複雜。 當我們驗證卡拉茲猜想的時候,為了避免重複計算,可以記錄下遞推過程中遇到的每一個數。例如對 n=3 進行驗證的時候,我們需要計算 3、5、8、4、2、1,則當我們對 n=5、8、4、2 進行驗證的

1005 繼續(3n+1)猜想 25 分java 實現

1005 繼續(3n+1)猜想 (25 分) 卡拉茲(Callatz)猜想已經在1001中給出了描述。在這個題目裡,情況稍微有些複雜。 當我們驗證卡拉茲猜想的時候,為了避免重複計算,可以記錄下遞推過程中遇到的每一個數。例如對 n=3 進行驗證的時候,我

(PAT乙級)1005 繼續(3n+1)猜想

卡拉茲(Callatz)猜想已經在1001中給出了描述。在這個題目裡,情況稍微有些複雜。 當我們驗證卡拉茲猜想的時候,為了避免重複計算,可以記錄下遞推過程中遇到的每一個數。例如對n=3進行驗證的時候,我們需要計算3、5、8、4、2、1,則當我們對n=5、8、4

PAT乙級1005 繼續(3n+1)猜想

卡拉茲(Callatz)猜想已經在1001中給出了描述。在這個題目裡,情況稍微有些複雜。 當我們驗證卡拉茲猜想的時候,為了避免重複計算,可以記錄下遞推過程中遇到的每一個數。例如對n=3進行驗證的時候,我們需要計算3、5、8、4、2、1,則當我們對n=5、8、4、2進行驗證的時候,就可以直接判定卡拉茲猜想

PAT 乙級 1005 繼續(3n+1)猜想

1005 繼續(3n+1)猜想 (25 point(s)) 卡拉茲(Callatz)猜想已經在1001中給出了描述。在這個題目裡,情況稍微有些複雜。 當我們驗證卡拉茲猜想的時候,為了避免重複計算,可以記錄下遞推過程中遇到的每一個數。例如對 n=3