6174問題

    假如你有一個各位數字互不相同的四位數,把所有數字從大到小排序後得到a,從小到大排序後得到b,然後用a-b替換原來這個數,並且繼續操作。例如,從1234出發,依次可以得到4321-1234=3087,8730-378=8352,8532-2358=6174。有趣的是,7641-1467=6174,回到他自己。輸入一個n位數,輸出操作序列,直到出現循環(即新得到的數曾經得到過)。輸入保證在循環之前最多隻會產生1000個整數

樣例輸入:1234

樣例輸出:1234->3087->8352->6174->6174

代碼:

#include <stdio.h>  
#include <string.h>
#define MAX 1000
int num[MAX],count;
int f(int x)
{
	char s[MAX];
	int b,a,i,j,t,n;
	//1.將輸入的整數轉換爲字符形式
	sprintf(s,"%d",x); 
	n=strlen(s);
	//2.從小到大排序 
	for(i=0;i<n;i++)
	{
		 for(j=n-1;j>i;j--)
		 {
		 	if(s[j-1]>s[j])
			{
				t=s[j-1];
				s[j-1]=s[j];
				s[j]=t;
		    }
		}
	}
	sscanf(s,"%d",&a);
	//3.從大到小排序 
	for(i=0;i<n;i++)
	{
		 for(j=n-1;j>i;j--)
		 {
		 	if(s[j-1]<s[j])
			{
				t=s[j-1];
				s[j-1]=s[j];
				s[j]=t;
		    }
		}
	}
	sscanf(s,"%d",&b);
	//4.輸出差值 把每次調用結果給輸出來 
	return b-a; 
}
int main()
{
	int x,i,found;
	scanf("%d",&x);
	num[0]=x;
	printf("%d",x);
	count=1;
	for(;;)
	{
		//1.生成並且輸入下一個數 
		num[count]=f(num[count-1]);
		printf("->%d",num[count]);
		//2.在數組num中尋找新生成的數 即是否爲之前出現過的數字 
		found=0;
		for(i=0;i<count;i++)
		{
			if(num[i]==num[count])
			{
				found =1;
				break;
			}
		} 
		//3.如果找到新生成的數則退出循環 
		if(found)  break;
		count++;
	} 
	printf("\n");
	return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章