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

傳送門

PAT (Basic Level) Practise (中文)1005. 繼續(3n+1)猜想 (25))

題目

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

提交代碼

#include <stdio.h>

int main()
{
//  freopen("D:\\C\\test.txt","r",stdin);
    int n, cnt, i;
    scanf("%d", &n);
    int a[100] = {0}, b[100] = {0};

    for ( cnt=0; cnt<n; cnt++) scanf("%d", &b[cnt]);
    for ( cnt=0; b[cnt]; cnt++) a[cnt] = b[cnt];

    for ( cnt=0; cnt<n; cnt++) {
        int c = a[cnt];
        while ( c!=1 ) {
            if ( c%2 ) c =  (3*c+1)/2;
            else c /= 2;
            for ( i=0; i<n; i++) {
                if ( b[i]==c ) b[i] = 0;
            }
        }
    }
    
    int j, k;
    for ( j=n; j>1; j-- ) {
        for ( k=n-1; k>(n-j); k-- ) {
            if ( b[k-1]<b[k] ) {
                int swap = b[k-1];
                b[k-1] = b[k];
                b[k] = swap;
            }
        }
    }
    
    printf("%d", b[0]);
//  printf("%d", b[1]);
    for ( cnt=1; cnt<n; cnt++ ) {
        if ( b[cnt+1]==0 ) {
            if ( b[cnt]!=0 ) printf(" %d", b[cnt]);
            break; 
        }else printf(" %d", b[cnt]);
    }
    return 0;
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容