1. 程式人生 > 其它 >實驗4-1-12 黑洞數 (20分)

實驗4-1-12 黑洞數 (20分)

技術標籤: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

AC Code

#include <stdio.h>
#include <stdlib.h>
int a[3];

int cmp(const void *a, const void *b){
    return *(int *)a - *(int *)b;
}

int max_shuffle(int n){
    a[0] = n%10, a[1] = n/100, a[2] = n/10%10;
    qsort(a, sizeof(a)/sizeof(a[0]), sizeof(a[0]), cmp);
    return a[2]*100 + a[1]*10 + a[0];
}

int min_shuffle(int n){
    a[0] = n%10, a[1] = n/100, a[2] = n/10%10;
    qsort(a, sizeof(a)/sizeof(a[0]), sizeof(a[0]), cmp);
    return a[0]*100 + a[1]*10 + a[2];
}
int main(){
    int n, num = 1, d;
    scanf("%d", &n);
    do{
        d = max_shuffle(n) - min_shuffle(n);
        printf("%d: %d - %d = %d\n", num++, max_shuffle(n), min_shuffle(n), d);
        n = d;
    }while( d!=0 && d != 495);
    return 0;
}