為什么這段代碼無法AC?是我對題意理解有誤?還是代碼有漏洞??
當我們驗證卡拉茲猜想的時候,為了避免重復計算,可以記錄下遞推過程中遇到的每一個數。例如對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>
#include<stdlib.h>
int main()
{
int n; int *a; int t; int p = 0; int i = 0, j = 0; scanf("%d", &n); a = (int*)calloc(n, sizeof(int)); while(n != i){ scanf("%d", &a[i++]); } for( j = 0; j < n - 1; j++) for(i = 0; i < n - 1 - j; i++) if(a[i] < a[i + 1]) t = a[i],a[i] = a[i +1], a<愛尬聊_尬聊生活>[i + 1] = t;for(i = 0; i < n; i++){ p = a[i]; while(p > 1){ if(p % 2 == 0){ p = p / 2; } else{ p = p * 3 + 1; } for(j = 0; j < n; j++){ if( p == a[j]) a[j] = 0;} }
}
i = 0;
while(i != n){
if(a[i] != 0) printf("%d ", a[i]); i++;
}
printf("(此處應有反斜杠但未顯示)b");
free(a);
return 0;
}