1. 程式人生 > >PTA-黑洞數(C語言)

PTA-黑洞數(C語言)

黑洞數也稱為陷阱數,又稱“Kaprekar問題”,是一類具有奇特轉換特性的數。

任何一個各位數字不全相同的三位數,經有限次“重排求差”操作,總會得到495。最後所得的495即為三位黑洞數。所謂“重排求差”操作即組成該數的數字重排後的最大數減去重排後的最小數。(6174為四位黑洞數。)

例如,對三位數207:

第1次重排求差得:720 - 27 = 693;
第2次重排求差得:963 - 369 = 594;
第3次重排求差得:954 - 459 = 495;
以後會停留在495這一黑洞數。如果三位數的3個數字全相同,一次轉換後即為0。

任意輸入一個三位數,程式設計給出重排求差的過程。

輸入格式:
輸入在一行中給出一個三位數。

輸出格式:
按照以下格式輸出重排求差的過程:

序號: 數字重排後的最大數 - 重排後的最小數 = 差值
序號從1開始,直到495出現在等號右邊為止。

輸入樣例:
123
輸出樣例:
1: 321 - 123 = 198
2: 981 - 189 = 792
3: 972 - 279 = 693
4: 963 - 369 = 594
5: 954 - 459 = 495

方法一:冒泡法排序計算

#include<stdio.h>
int H(int n){
	int a[3],t=0,b=0,c=0;
	a[0]=n/100;
	a[1]=(n%100)/10;
	a[2]=n%10;
	for(int j=0;j<2;j++){      //從小到大排序 
		for(int i=0;i<2-j;i++){
			if(a[i]>a[i+1]){
				t=a[i];
				a[i]=a[i+1];
				a[i+1]=t; 
			}
		}
	}
	b=a[2]*100+a[1]*10+a[0];
	c=a[0]*100+a[1]*10+a[2];
	printf("%d - %d = %d\n",b,c,b-c);
	return b-c;
}
int main()
{
	int n=0,t=0;
	scanf("%d",&n);
	while(n!=495||t==0){      //判斷t==0  控制輸入495時 進入一次迴圈
		printf("%d: ",++t);
		n=H(n);
	}
    return 0;
}

方法2:直接計算

#include<stdio.h>
int main()
{
	int n=0,t=0,a=0,b=0,c=0,j,max=0,min=0;
	scanf("%d",&n);
	while(n!=495||t==0){       //判斷t==0  控制輸入495時 進入一次迴圈
		a=n/100;b=(n%100)/10;c=n%10;
		if(a<b){j=a;a=b;b=j;}
		if(a<c){j=a;a=c;c=j;}
		if(b<c){j=b;b=c;c=j;}
		max=a*100+b*10+c;
		min=c*100+b*10+a;
		n=max-min;
		printf("%d: %d - %d = %d\n",++t,max,min,n);
	}
    return 0;
}