繼續(3n+1)猜想(PAT)

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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章