1.題目描述
卡拉茲(Callatz)猜想已經在1001中給出了描述。在這個題目裏,情況稍微有些複雜。
當我們驗證卡拉茲猜想的時候,爲了避免重複計算,可以記錄下遞推過程中遇到的每一個數。例如對n=3進行驗證的時候,我們需要計算3、
5、8、4、2、1,則當我們對n=5、8、4、2進行驗證的時候,就可以直接判定卡拉茲猜想的真僞,而不需要重複計算,因爲這4個數已經在
驗證3的時候遇到過了,我們稱5、8、4、2是被3“覆蓋”的數。我們稱一個數列中的某個數n爲“關鍵數”,如果n不能被數列中的其他數字所覆蓋。
現在給定一系列待驗證的數字,我們只需要驗證其中的幾個關鍵數,就可以不必再重複驗證餘下的數字。你的任務就是找出這些關鍵數字,並按從大到小的順序輸出它們。
2.輸入描述:
每個測試輸入包含1個測試用例,第1行給出一個正整數K(<100),第2行給出K個互不相同的待驗證的正整數n(1<n<=100)的值,數字間用空格隔開。
3.輸出描述:
每個測試用例的輸出佔一行,按從大到小的順序輸出關鍵數字。數字間用1個空格隔開,但一行中最後一個數字後沒有空格。
4.輸入例子:
6
3 5 6 7 8 11
5.輸出例子:
7 6
6.解題思路:
(3n+1)猜想:
如果n爲偶數,則n/2
如果n爲奇數,則(3n+1)/2
根據(3n+1)猜想的每次循環中所得到的數,在輸入的數組中查找是否已經存在
如果存在則將數組原本的數置爲0
最後對數組進行排序,並輸出不爲0的數
7.源代碼:
#include<stdio.h>
int main()
{
int i,j,K,temp,num[100]={0};
scanf("%d",&K);
for(i=0;i<K;i++)
scanf("%d",&num[i]);
for(i=0;i<K;i++)
{
temp=num[i];
while(temp!=0&&temp!=2)
{
if(temp%2==0)
temp=temp/2;
else
temp=(3*temp+1)/2;
for(j=0;j<K;j++)
if(num[j]==temp)
num[j]=0;
}
}
for(i=0;i<K;i++)//冒泡排序
{
int flag=0;
for(j=0;j<K-i-1;j++)
if(num[j]<num[j+1])
{
temp=num[j];
num[j]=num[j+1];
num[j+1]=temp;
flag=1;
}
if(flag==0)
break;
}
for(i=0;num[i]>0;i++)
{
if(num[i+1]!=0)
printf("%d ",num[i]);
else
printf("%d",num[i]);
}
return 0;
}