1. 程式人生 > >PTA 中M2018秋C入門和進階練習 7-44 黑洞數 (20 分)

PTA 中M2018秋C入門和進階練習 7-44 黑洞數 (20 分)

7-44 黑洞數 (20 分)

黑洞數也稱為陷阱數,又稱“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 main () {
    
    int count=0,max,mini,number;
    int maximum(int number);
    int minimum(int number);
    scanf("%d",&number);
    
    while(number!=0){   //三位數的3個數字相同不執行迴圈
        count++;
        max = maximum(number);
        mini = minimum(number);
        number = max - mini;
        printf("%d: %d - %d = %d\n",count,max,mini,number);
        if (number == 495)    
            break;          
    }
    return 0;
    
}

int maximum(int number){
	int a,b,c,t;    
	//取出各位的值分別賦給a,b,c;
	a =  number /100;  
    b = number % 100 / 10;
    c = number % 10;
    //按降序把數存入a,b,c;
	if (b>a)
	{
		t = a;
		a = b;
		b = t;
	}
	if (c>a)
	{
		t = a;
		a = c;
		c = t;
	}
	if (c>b)
	{
		t = c ;
		c = b ;
		b = t ;
	}
	t = a*100 + b*10 + c;	
	return t;
}

int minimum(int number){
	int a,b,c,t;    
	//取出各位的值分別賦給a,b,c;
	a =  number /100;  
    b = number % 100 / 10;
    c = number % 10;
    //按降序把數存入a,b,c;
	if (b>a)
	{
		t = a;
		a = b;
		b = t;
	}
	if (c>a)
	{
		t = a;
		a = c;
		c = t;
	}
	if (c>b)
	{
		t = c ;
		c = b ;
		b = t ;
	}
	t = c*100 + b*10 + a;	
	return t;
}