1. 程式人生 > >C語言求黑洞數程式碼及解析

C語言求黑洞數程式碼及解析

問題描述

程式設計求三位數中的“黑洞數”。

黑洞數又稱陷阱數,任何一個數字不全相同的整數,經有限次“重排求差”操作,總會得到某一個或一些數,這些數即為黑洞數。“重排求差”操作是將組成一個數的各位數字重排得到的最大數減去最小數,例如207,“重排求差”操作序列是720-027=693,963-369=594,954-459=495,再做下去就不變了,再用208算一次,也停止到495,所以495是三位黑洞數。

問題分析

根據“黑洞數”定義,對於任一個數字不全相同的整數,最後結果總會掉入到一個黑洞圈或黑洞數裡,最後結果一旦為黑洞數,無論再重複進行多少次的“重排求差”操作,則結果都是一樣的,可把結果相等作為判斷“黑洞數”的依據。

演算法設計

過程如下:

(1) 將任一個三位數進行拆分。

(2) 拆分後的資料重新組合,將可以組合的最大值減去最小值,差賦給變數j。

(3) 將當前差值暫存到另一變數h中:h=j。

(4) 對變數j執行拆分、重組、求差操作,差值仍然儲存到變數j中。

(5) 判斷當前差值j是否與前一次的差相等,若相等將差值輸出並結束迴圈,否則,重複步驟 (3)、(4) 和 (5)。

下面是完整的程式碼:

#include <stdio.h>
int maxof3(int, int, int);
int minof3(int, int, int);
int main()
{
    int i, k;
    int hun, oct, data, max, min, j, h;
    printf("請輸入一個三位數:");
    scanf("%d", &i);
    hun=i/100;
    oct=i%100/10;
    data=i%10;
    max=maxof3(hun, oct, data);
    min=minof3(hun, oct, data);
    j=max-min;
    for(k=0; ; k++)  /*k控制迴圈次數*/
    {
        h=j;  /*h記錄上一次最大值與最小值的差*/
        hun=j/100;
        oct=j%100/10;
        data=j%10;
        max=maxof3(hun, oct, data);
        min=minof3(hun, oct, data);
        j=max-min;
        if(j==h)  /*最後兩次差相等時,差即為所求黑洞數*/
        {
            printf("%d\n", j);
            break;  /*跳出迴圈*/
        }
    }
    return 0;
}
/*求三位數重排後的最大數*/
int maxof3(int a,int b,int c)
{
    int t;
    if(a<b)  /*如果a<b,將變數a、b的值互換*/
    {
        t=a;
        a=b;
        b=t;
    }
    if(a<c)
    {
        t=a;
        a=c;
        c=t;
    }
    if(b<c)
    {
        t=b;
        b=c;
        c=t;
    }
    return(a*100+b*10+c);
}
/*求三位數重排後的最小數*/
int minof3(int a, int b, int c)
{
    int t;
    if(a<b)
    {
        t=a;
        a=b;
        b=t;
    }
    if(a<c)
    {
        t=a;
        a=c;
        c=t;
    }
    if(b<c)
    {
        t=b;
        b=c;
        c=t;
    }
    return(c*100+b*10+a);
}

執行結果

C語言求黑洞數程式碼及解析